В Swift, какая разница между звонками UINavigation()
vs UINavigation.init()
? Кажется, что оба они возвращают действительный экземпляр UINavigationController
.В Swift, в чем разница между вызовом UINavigationController() и UINavigationController.init()?
ответ
Из документов Apple вы используете init
при подклассификации контроллера. Похоже, не передавая значение функции блока, он просто возвращает качестве стандарта UINavigationController
https://developer.apple.com/reference/uikit/uinavigationcontroller
UINavigationController()
и UINavigationController.init()
точно такие же вещи. Вы можете проверить это, введя оба в игровое поле, а затем вариант -clicking на них. Оба приводят документацию для того же самого инициализатора.
Соглашение о Swift должно использовать только имя типа (без .init
).
Для некоторого заданного типа (например, UINavigationController
), нет никакой разницы между обработкой вызовов к UINavigationController()
или UINavigationController.init()
, но последний синтаксис может (без ()
вызова) будет полезен при обращении к инициализатору какого-либо типа, скажем, Foo
, в условиях, когда мы хотим использовать закрытие (или ссылки на закрытие), который должен иметь
- ноля или более аргументов, и
- типа возвращаемого
Foo
,
например, (Int, Double) -> Foo
. В этих контекстах использование синтаксиса Foo.init
может оказаться полезным: вместо того, чтобы явно разрешать замыкание повторно , вызовите известный инициализатор (связывая аргументы замыкания с инициализатором), мы можем использовать (ссылку на) инициализатор прямо как замыкание вместо , Если в аргументе инициализаторов Foo
нет двусмысленности, ссылка на Foo.init
в определенном контексте типа замыкания будет разрешена с использованием вывода типа правильному инициализатору.
Например, рассмотрим следующий пример
struct Foo {
let foo: Int
// (Int) -> Foo
init(foo: Int) {
self.foo = 2*foo
}
// (Int, Int) -> Foo
init(foo: Int, bar: Int) {
self.foo = foo + bar
}
//() -> Foo
init() {
self.foo = 42
}
}
let arr = [1, 2, 3]
let fooArr1 = arr.map { Foo(foo: $0) }
let fooArr2 = arr.map(Foo.init)
/* map operation expects a single argument of type (Int) -> Foo,
which we generally supply as a trailing closure. In this context,
Swift can, without ambiguity (since we have none, is this example),
find the correct overload among the initializers of Foo */
print(fooArr1.map { $0.foo }, fooArr2.map { $0.foo }) // [2, 4, 6] [2, 4, 6]
let emptyTupArr = [(),(),()]
let fooArr3 = emptyTupArr.map(Foo.init) // inferred to be the '() -> Foo' initializer
print(fooArr3.map { $0.foo }) // [42, 42, 42]
- 1. В чем разница между «вызовом» и «вызовом»?
- 2. В чем разница между привязкой и вызовом?
- 3. В чем разница между вызовом ISUP и вызовом ISDN?
- 4. В чем разница между системным вызовом и вызовом библиотеки?
- 5. В чем разница между «:» и «=» в Swift?
- 6. В чем разница между include() и вызовом функции в PHP?
- 7. Разница между обратным вызовом и обратным вызовом
- 8. В чем разница между замыканиями и обратными вызовами в Swift?
- 9. В чем разница между свойством и переменной в Swift?
- 10. В чем разница между вызовом по ссылке и копированием/восстановлением
- 11. В чем разница между вложенным вызовом метода и делегатами?
- 12. В чем разница между удаленным вызовом процедуры и веб-службой
- 13. В чем разница между обычным вызовом функции и pcall
- 14. В чем разница между вызовом функции и возвратом функции?
- 15. В чем разница между вызовом функции и передачей функции?
- 16. В чем разница между обратным вызовом и частичной обратной связью?
- 17. В чем разница между крюком и обратным вызовом?
- 18. В чем разница между обратной передачей, автоповтором и обратным вызовом?
- 19. В чем разница между нажатием кнопки и вызовом функции «.click()»?
- 20. В чем разница между командой chroot и системным вызовом chroot()
- 21. В чем разница между вызовом MyClass.class и MyClass.getClass()
- 22. В чем разница между вызовом exampleFunction() и exampleFunction.call()?
- 23. В чем разница между продолжениями и нормальным вызовом?
- 24. В чем разница между использованием декоратора и его явным вызовом?
- 25. В чем разница между вызовом функции и функцией обратного вызова?
- 26. В чем разница между response.body() и объектом, возвращаемым обратным вызовом?
- 27. В чем разница между бесконечным циклом и бесконечным рекурсивным вызовом?
- 28. В чем разница между вызовом Stream.Write и использованием StreamWriter?
- 29. В чем разница между вызовом LayoutInflater напрямую и нет?
- 30. В чем разница между передачей сообщений и вызовом метода?
Единственное место, где вы, кажется, нужно вызвать 'Init()' явно (насколько я могу сказать) является 'super.init()' при переопределении инициализатор ... –
@NicolasMiari хорошая точка, но в качестве дополнения, однако, стоит отметить, что 'super' - это не тип, а специальный префикс Swift, используемый для доступа к методам и свойствам суперкласса (а не только' init (...) '). Его варианты использования и доступ больше похожи на экземпляр типа, а не самого типа (за исключением, в частности, инициализаторов суперкласса). – dfri
Действительно, это не то же самое, что 'Classname.init()' –