1

Swift では、呼び出しと呼び出しの違いは何UINavigation()ですかUINavigation.init()? どちらも の有効なインスタンスを返すようですUINavigationController

4

3 に答える 3

5

UINavigationController()UINavigationController.init()まったく同じものです。これを確認するには、両方を Playground に入力してから -optionクリックします。どちらも同じイニシャライザのドキュメントを表示します。

Swift の規則では、型名のみを使用します ( は使用しません.init)。

于 2016-11-21T02:31:39.500 に答える
4

特定の型 ( など) については、 orの呼び出し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]
于 2016-11-21T09:05:38.790 に答える
0

Apple ドキュメントからinit、コントローラーをサブクラス化するときに使用します。ユニット関数に値を渡さずに、標準の UINavigationController を返すだけのように見えます

https://developer.apple.com/reference/uikit/uinavigationcontroller

于 2016-11-21T00:26:11.457 に答える