2016-11-20 28 views

回答

4

UINavigationController()UINavigationController.init()是同樣的事情。您可以通過在Playground中輸入以及選項並點擊它們來驗證。兩者都提供相同的初始化程序的文檔。

Swift約定只使用類型名稱(不包括.init)。

+2

,你似乎需要調用'的init()唯一的地方'覆蓋時明確(據我可以告訴)是'super.init()'一個初始化器...... –

+1

@NicolasMiari是一個很好的觀點,但作爲一個附錄,它可能值得注意,然而,'super'不是一種類型,而是一種用於訪問超類方法和屬性的特殊Swift前綴(不僅僅是'init ...)')。它的用例和訪問更類似於一個類型的實例,而不是類型本身(特別是超類的初始化程序除外)。 – dfri

+0

事實上,它與'Classname.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] 
相關問題