【发布时间】:2021-07-16 09:39:09
【问题描述】:
我是 Swift 新手,我刚刚看到了这个声明:
var completionHandlers = [(String) -> Void]()
据我所知,这一行声明了一个类型为 (String) -> Void 的闭包数组,但我不确定括号中的含义。
【问题讨论】:
-
括号表示init,数组的init
标签: swift variable-declaration
我是 Swift 新手,我刚刚看到了这个声明:
var completionHandlers = [(String) -> Void]()
据我所知,这一行声明了一个类型为 (String) -> Void 的闭包数组,但我不确定括号中的含义。
【问题讨论】:
标签: swift variable-declaration
[MyType]() 只是syntactic sugar 的Array<MyType>(),它本身就是Array<MyType>.init() 的语法糖。它初始化一个空数组MyTypes。
它有自己的特殊语法,因为Array 是一种常见的数据类型。
例如,Dictionary 也有 [String: MyType]() 样式的语法糖。
【讨论】:
括号是调用初始化器的一种方式。
这相当于:
var completionHandlers: [(String) -> Void] = []
你会看到它的另一种方式是:
var completionHandlers: [(String) -> Void] = .init()
你在初始化空集合时会看到它,因为如果你有:
var someVariable = ["hello", "world"]
编译器能够将someVariable 的类型推断为[String],因为它知道内容的类型。但是你不能像这样初始化一个空数组,因为没有关于类型的信息。所以[(String) -> Void]() 是向空初始化器提供类型的一种方式。
Swift 中的一般建议是使用 Type Inference,其中变量的类型是从其初始值推断出来的:
let intVariable = 3
let stringVariable = "Hello"
//etc
您问题中的代码风格如下。
但在某些类型更复杂的情况下,这会降低编译器的速度,因此许多人的变量声明更加明确。
let intVariable: Int = 3
let stringVariable: String = "Hello"
这是一个品味问题(和争论)。
【讨论】: