1

UINavigation()在 Swift 中,调用vs有什么区别UINavigation.init()?他们似乎都返回了有效的UINavigationController.

4

3 回答 3

5

UINavigationController()并且UINavigationController.init()是完全相同的东西。您可以通过在 Playground 中输入两者然后option单击它们来验证这一点。两者都显示了相同初始化程序的文档。

Swift 的约定是只使用类型名称(不带.init)。

于 2016-11-21T02:31:39.500 回答
4

对于某些给定类型(例如),调用orUINavigationController之间没有区别,但是后一种语法(没有调用)在引用某个给定类型的初始化程序时很有用,例如,在我们想要使用的上下文中一个闭包(或对闭包的引用)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 回答