来自 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
,我们可以将文字元组写在文字数组中,并且没有歧义。类型别名和构造函数同样是明确的。
我有一个 (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
,我们可以将文字元组写在文字数组中,并且没有歧义。类型别名和构造函数同样是明确的。