Swift 我可以参加一个班级吗;如果让;构造可选对象的方式?
我可以使用Swift 我可以参加一个班级吗;如果让;构造可选对象的方式?,swift,boolean,optional,Swift,Boolean,Optional,我可以使用if letconstruct来展开选项,如下所示: if let x = someOptional { // x represents the value of someOptional, and is known to be non-nil } class MyLogical : SomeProtocolForSwiftToKnowHowToTreatMyClassAsBool { ... var boolValue : Bool { re
if let
construct来展开选项,如下所示:
if let x = someOptional {
// x represents the value of someOptional, and is known to be non-nil
}
class MyLogical : SomeProtocolForSwiftToKnowHowToTreatMyClassAsBool {
...
var boolValue : Bool {
return ... // true or false, depending on the state of my object
}
}
除了进行展开,Swift编译器还知道将let x=someOptional
构造作为逻辑值处理
的逻辑是可选的
内置于编译器本身,还是可以用相同的行为定义我自己的类
换句话说,我可以这样写吗:
if let x = someOptional {
// x represents the value of someOptional, and is known to be non-nil
}
class MyLogical : SomeProtocolForSwiftToKnowHowToTreatMyClassAsBool {
...
var boolValue : Bool {
return ... // true or false, depending on the state of my object
}
}
让斯威夫特把它当作一个逻辑值,我可以把它放在
if
条件中,有没有let
if let x = getMyLogical() {
assert(x.boolValue) // boolValue must evaluate to true to get here
}
注意:我记得在早期版本的Swift中有一个
逻辑值
协议,并且可选
用于遵守该协议LogicalValue
现在不存在了,也没有替代品(BooleanType
现在有了boolValue
属性,但是苹果不鼓励遵守BooleanType
协议,除非你的类代表一个简单的布尔值).斯威夫特强大的模式匹配系统使接近这一点成为可能。case let…
模式实现了您提出的许多功能:
if case let x = getMyLogical() where x.boolValue {
assert(x.boolValue) // boolValue must evaluate to true to get here
}
它也适用于guard
语句:
guard case let x = getMyLogical() where x.boolValue else { fatalError() }
assert(x.boolValue) // boolValue must evaluate to true to get here
换句话说,case let…
语法可用于有条件地将任何值绑定到任何名称,以便在if
块中或guard
语句之后使用
为了完整性,我假设它也在开关
块中工作:
switch getMyLogical() {
case let x where x.boolValue:
assert(x.boolValue) // boolValue must evaluate to true to get here
default:
break
}
作为循环的逻辑测试:
while case let x = getMyLogical() where x.boolValue {
assert(x.boolValue) // boolValue must evaluate to true to get here
}
很长一段时间以来,我一直认为switch
语句是唯一可以使用case let…
的地方,但它们也可以在其他地方使用
我要补充最后一点。case let…
图案甚至可以用于展开选项:
let num: Int? = 42
if case let x? = num {
print(x)
}
用于展开选项的
if let…
语法似乎是通用case let…
模式匹配语法的一个特例,它增加了一点语法糖分,使选项更易于使用,但与更通用的case let…
功能没有根本区别“让斯威夫特把它当作一个逻辑值,我可以把它放在一个if条件中”但你似乎把苹果和橙子混淆了,不,现在不清楚你想做什么将需要生成一些可以是nil
的内容,如果不是,则可以取消包装-根本不是逻辑值”她说。你想要类似布尔值的东西还是可选的类似东西?@matt不表示我可以设置为nil
的东西,而不是我可以转换回nil
的东西?我不介意将nil
返回给那些我想保留在if
语句之外的内容,除非返回false
。基本上,我正在寻找一种方法来“自定义”自定义函数到可选的实现?这是源代码可用的东西吗?我会在Swift源代码中签出,或者在Xcode中键入Optional
,然后“跳转到声明”以查看公共模块映射。这甚至更好,因为调用x.boolValue
是显式的。谢谢