来自 UI 控件的奇怪 Bool 类型

Strange Bool type from UI control

我有一个 (String,Bool) 元组数组:

var names : [(name:String, important:Bool)] = [("Paul",true), ("Peter",false)]

我还有一个UISwitch控件:

@IBOutlet weak var importantSwitch: UISwitch!

我要添加到数组中,使用开关状态来判断Bool

以下有效:

names.append( name: "whatever", important: importantSwitch.on )

XCode 报告的问题是 "type T does not conform to protocol IntegerLiteralConvertible"。

这些确实有效:

let i : Bool = importantSwitch.on
names.append( name: "whatever", important: i )

names.append( name: "whatever", important: importantSwitch.on==true )

我的问题基本上是,为什么?

一个简单而令人满意的重写是投射:

names.append(name: "whatever", important: importantSwitch.on as Bool)

更好的是,如果你不想表演 任何 演员或分配舞蹈,那么使用 extend 而不是 append:

names.extend([(name: "whatever", important: importantSwitch.on)])

正如 Martin R 所说,类型别名也可以解决这个问题,因为它可以让您明确提供构造函数:

typealias Pair = (name:String, important:Bool)
var names = [Pair]()
names.append(Pair(name: "whatever", important: importantSwitch.on))

我认为 extend 直接起作用而 append 并没有说明问题所在:这是元组语法。这里的问题是——尽管这是一个鲜为人知的事实——一个函数参数列表,因此函数调用中的参数列表,本身实际上是一个元组。

因此,当您说 names.append(...) 时,括号中的内容是参数列表 - 您是否正在尝试调用 append,就好像 具有命名参数一样name:important: - 或者它 本身 是您要附加的元组? Swift 知道这是一个元组数组并尝试计算它,但它需要一些帮助。你可能认为我们可以用一组额外的括号来解决这个问题,但没有这样的运气;我认为这是因为多个嵌套的括号是没有意义的(它们在解析过程的早期被丢弃到一组括号中)。然而,使用extend,我们可以将文字元组写在文字数组中,并且没有歧义。类型别名和构造函数同样是明确的。