来自UI控件的奇怪Bool类型

时间:2015-01-10 21:36:27

标签: ios swift types uikit

我有一组(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报告的问题是“类型T不符合协议IntegerLiteralConvertible”。

这些确实有效:

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

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

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

1 个答案:

答案 0 :(得分:2)

一个简单而令人满意的重写就是施放:

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知道这是一个元组数组并尝试解决它,但它需要一些帮助。你可能认为我们可以通过一组额外的括号解决这个问题,但没有这样的运气;我认为这是因为多个嵌套的parens没有意义(它们在解析过程的早期被抛弃到一组parens)。但是,使用extend,我们可以在其中写入带有文字元组的文字数组,并且没有歧义。类型和构造函数同样明确无误。