【问题标题】:Strange Bool type from UI control来自 UI 控件的奇怪 Bool 类型
【发布时间】:2015-03-09 00:10:54
【问题描述】:

我有一个(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 )

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

【问题讨论】:

  • 带有元组的数组在 Swift 中仍然很奇怪,类似的例子请参见 stackoverflow.com/questions/24539679/…。定义类型别名在这里也有帮助。 (但这并不能回答“为什么”。)
  • @MartinR 好的,我想我已经抓住了“为什么”。

标签: ios swift types uikit


【解决方案1】:

一个简单而令人满意的重写是转换:

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,我们可以编写包含文字元组的文字数组,并且没有歧义。类型别名和构造函数同样是明确的。

【讨论】:

  • 但这并不能真正回答他的问题。 UISwitch 文档报告 on 是 Bool。你为什么要重新投射它已经是什么?
  • 如果您将 UISwitch 替换为具有 var on: Bool 属性的自定义纯 Swift 类,则会发生同样的问题。所以这是不是 BOOL->Bool 桥接或Objective-C->Swift 桥接问题。
  • 我同意该错误表明它不是Bool,但无法从文档中知道这一点,这似乎表明此行为是一个错误。如果 Apple 说它是 Bool,但它实际上是幕后的其他东西,不会充当 Bool,那就是糟糕的编程。
  • @mbm29414 好的,我想我已经想出了一个正确的解释并进行了相应的修改。谢谢你推我。 :)
  • @matt 现在这是一个绝妙的答案! ;-) 不过,这似乎是一个错误,因为它违反了最小惊讶原则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 2016-05-11
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
相关资源
最近更新 更多