在Swift中,调用UINavigationController()与UINavigationController.init()之间有什么区别?

时间:2016-11-20 23:31:51

标签: swift swift3 ios10 xcode8.1

在Swift中,调用UINavigation()UINavigation.init()之间的区别是什么?它们似乎都返回UINavigationController的有效实例。

3 个答案:

答案 0 :(得分:4)

UINavigationController()UINavigationController.init()完全相同。您可以通过在Playground中键入两个,然后在选项中单击它们来验证这一点。两者都提供了相同初始化程序的文档。

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

答案 1 :(得分:4)

对于某些特定类型(例如UINavigationController),调用UINavigationController()UINavigationController.init()之间没有区别,但后一种语法可以(没有在我们想要使用闭包(或引用闭包)的上下文中引用某个给定类型的初始值设定项(例如())时,Foo调用)很有用。 p>

  • 零个或多个参数,
  • 返回类型Foo
例如,(Int, Double) -> Foo。在这些上下文中,使用语法Foo.init可能证明是有用的:我们可以使用(引用)而不是显式地让闭包重复调用一个已知的初始化器(将闭包的参数传递给初始化器)。 to)初始化器直接作为闭包。如果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]

答案 2 :(得分:0)

从Apple文档中,您在为控制器创建子类时使用String.prototype.removeAt = function(start, end) { return this.substr(0, start) + this.substr(end); } string.removeAt(7, 10); // Outputs: "I am a ing" 。看起来没有将值传递给单元函数,它只返回一个标准的UINavigationController

Ken White's answer