Swift では、呼び出しと呼び出しの違いは何UINavigation()
ですかUINavigation.init()
? どちらも の有効なインスタンスを返すようですUINavigationController
。
3 に答える
UINavigationController()
とUINavigationController.init()
まったく同じものです。これを確認するには、両方を Playground に入力してから -optionクリックします。どちらも同じイニシャライザのドキュメントを表示します。
Swift の規則では、型名のみを使用します ( は使用しません.init
)。
特定の型 ( など) については、 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]
Apple ドキュメントからinit
、コントローラーをサブクラス化するときに使用します。ユニット関数に値を渡さずに、標準の UINavigationController を返すだけのように見えます
https://developer.apple.com/reference/uikit/uinavigationcontroller