我正在尝试将BooleanLiteralConvertible支持添加到我的类中,以便我可以使用布尔值实例化它.抛弃循环的东西是布尔值和布尔文字之间的区别.
例如,添加协议后,我试图这样做:
func setSelected(value: Bool) { var node: MyClass = value }
但Swift抱怨它无法将Bool转换为MyClass.我花了一段时间才意识到它必须是一个布尔文字.奇怪的是,以下工作正常:
func setSelected(value: Bool) { var node: MyClass = value ? true : false }
……这对我来说似乎太傻了.这个看似非常离奇的要求是否有正当理由?
我喜欢这个问题.只有Swift团队可以肯定地回答,但我可以推测为什么:将类型值转换为不同类型的变量而不进行显式转换或转换很容易与程序员错误混淆,并且在很多情况下是编译器应警告.
原文链接:https://www.f2er.com/swift/318598.html示例(并假设Person也是一个StringLiteralConvertible,可以使用字符串变量以及您在问题中提出的文字来初始化):
struct Person { private static var idCounter = 1 var name:String let id:Int init(withName name:String) { Person.idCounter += 1 self.name = name self.id = Person.idCounter } } var person = Person(withName:"Mary") let name = "John" person = name
上面的代码看起来很像一个错误,程序员将错误类型(String)的值赋给Person类型的变量.事实上这可能是一个错误.也许程序员只是想更改人名(person.name = name)而不创建具有新唯一ID的新Person.或者也许程序员打算给人分配一些其他值但是输入错字或代码完成错误.没有成为原始程序员,或仔细研究所有上下文,看看这种转换是否有意义,很难说.并且从最初初始化变量的位置进一步分配变得越来越难以编译器在此警告类型为String的值是否被赋值给Person类型的变量?
这个例子会更加清晰,更符合Swift惯例:
var person = Person(withName:"Mary") let name = "John" person = Person(withName:name)
上述版本对于编译器和后来阅读本文的任何其他程序员来说都是完全明确的.