我有一个 (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 不符合协议(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
,我们可以编写其中包含文字元组的文字数组,并且没有歧义。类型别名和构造函数同样明确。
关于ios - 来自 UI 控件的奇怪 Bool 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27881460/