Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 我可以参加一个班级吗;如果让;构造可选对象的方式?_Swift_Boolean_Optional - Fatal编程技术网

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
。基本上,我正在寻找一种方法来“自定义”自定义函数到的功能,如果语句-类似于我可以在C++中通过提供隐式操作符来转换为<代码> BOOL的方式。您查看了Swift模块中的<代码>可选< /Cord>枚举的实现吗?你想模仿这样的东西吗?@JAL我在哪里寻找
可选
的实现?这是源代码可用的东西吗?我会在Swift源代码中签出,或者在Xcode中键入
Optional
,然后“跳转到声明”以查看公共模块映射。这甚至更好,因为调用
x.boolValue
是显式的。谢谢