在Swift中,撥打UINavigation()
與UINavigation.init()
有什麼區別?他們似乎都返回UINavigationController
的有效實例。在Swift中,調用UINavigationController()與UINavigationController.init()之間有什麼區別?
0
A
回答
0
從Apple文檔中,當您對控制器進行子類化時,使用init
。它看起來就像沒有值傳遞給單元的功能,它只是返回一個標準的UINavigationController
https://developer.apple.com/reference/uikit/uinavigationcontroller
4
UINavigationController()
和UINavigationController.init()
是同樣的事情。您可以通過在Playground中輸入以及選項並點擊它們來驗證。兩者都提供相同的初始化程序的文檔。
Swift約定只使用類型名稱(不包括.init
)。
2
對於一些給定類型(例如UINavigationController
),存在於UINavigationController()
或UINavigationController.init()
呼叫之間沒有差異,但是後者的語法可以(不()
呼叫)引用一些給定類型的一個初始化時是有用的,說Foo
,在這裏我們想利用封閉(或引用封)中的哪一個具有
- 零個或多個參數,
- 返回類型
Foo
,上下文
例如,(Int, Double) -> Foo
。在這些上下文中,使用語法Foo.init
可能證明是有用的:我們可以直接使用(引用)初始化器來作爲閉包,而不是明確地讓閉包重複地調用10已知的初始化器(將閉包的參數傳遞給初始化器),我們可以直接使用。如果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. DesiredCapabilities與RequiredCapabilities之間有什麼區別?
- 2. Console.WriteLine()與Debug.WriteLine()之間有什麼區別?
- 3. gets.chomp()與STDIN.gets.chomp()之間有什麼區別?
- 4. collection.find與回調和不回調之間有什麼區別?
- 5. [UINavigationController setView]和[UINavigationController setViewControllers]之間的區別
- 6. Swift 3中Any,Hashable,AnyHashable之間有什麼區別?
- 7. int:int和var在swift之間有什麼區別
- 8. ||之間有什麼區別?和|在R?
- 9. Swift包和模塊之間有什麼區別?
- 10. python函數調用與括號之間的區別是什麼?
- 11. 「層」和「層」之間有什麼區別?
- 12. Tableau和QlikView之間有什麼區別
- 13. Microsoft.CompilerServices.AsyncTargetingPack和Microsoft.Bcl.Async之間有什麼區別?
- 14. @Entity和@embeddable之間有什麼區別
- 15. ContentObservable和DataSetObservable之間有什麼區別?
- 16. touchmove和gesturechange之間有什麼區別?
- 17. 這兩行之間有什麼區別?
- 18. :notification.flags和notification.defaults之間有什麼區別?
- 19. proc和lambda之間有什麼區別?
- 20. :: after和after之間有什麼區別?
- 21. read()和io.read()之間有什麼區別?
- 22. Request()和Request.Form()之間有什麼區別?
- 23. WebServiceBinding.EmitConformanceClaims和WebServiceBinding.ConformanceClaims之間有什麼區別?
- 24. getA()和this.getA()之間有什麼區別?
- 25. (int)和intval()之間有什麼區別?
- 26. set_value和= pandas之間有什麼區別
- 27. * zoom和zoom之間有什麼區別?
- 28. {0}和「」之間有什麼區別?
- 29. typedef和using之間有什麼區別?
- 30. 「」和「'之間有什麼區別?
,你似乎需要調用'的init()唯一的地方'覆蓋時明確(據我可以告訴)是'super.init()'一個初始化器...... –
@NicolasMiari是一個很好的觀點,但作爲一個附錄,它可能值得注意,然而,'super'不是一種類型,而是一種用於訪問超類方法和屬性的特殊Swift前綴(不僅僅是'init ...)')。它的用例和訪問更類似於一個類型的實例,而不是類型本身(特別是超類的初始化程序除外)。 – dfri
事實上,它與'Classname.init()'不一樣' –