Swift 斯威夫特期权

Swift 斯威夫特期权,swift,ios8,Swift,Ios8,我正在观看苹果公司的所有swift教程,但其中一个例子有问题: class Person { var residence: Residence? } class Residence { var address: Address? } class Address { var buildingNumber: String? = "234" var streetName: String? = "Main St." var appartmentNumber:

我正在观看苹果公司的所有swift教程,但其中一个例子有问题:

class Person {
    var residence: Residence?
}

class Residence {
    var address: Address?
}

class Address {
    var buildingNumber: String? = "234"
    var streetName: String? = "Main St."
    var appartmentNumber: String?
}

let paul = Person()
var addressNumber: Int?

addressNumber = paul.residence?.address?.buildingNumber?.toInt()

if let number = addressNumber {
    "correct"
} else {
    "fault"
}

它总是打印出“错误”。有什么明显的东西我丢失了吗?

除了
Person()
之外,你从来不初始化任何东西,所以
paul
上的
residence
属性是
nil

let paul = Person()
addressNumber = paul.residence?.address?.buildingNumber?.toInt()
                      ^ failing right here, residence? returns nil
因此,在以下可选链中:

addressNumber = paul.residence?.address?.buildingNumber?.toInt()
                              ^ you get nil here and don't continue
这意味着
addressNumber
nil

let paul = Person()
addressNumber = paul.residence?.address?.buildingNumber?.toInt()
                      ^ failing right here, residence? returns nil
您不需要对paul执行任何其他操作,包括设置他的可选居留变量。因此,在下一行代码中,您将访问
paul
的住所
nil

let paul = Person()
addressNumber = paul.residence?.address?.buildingNumber?.toInt()
                      ^ failing right here, residence? returns nil

因此,使用可选链接,整个表达式返回
nil
,因此在下一个
if let
语句中进行比较时,它是false。这就是执行
else
子句的原因。

一步一步地仔细考虑。特别是,您的可选链接:

addressNumber=paul.residence?.address?.buildingNumber?.toInt()

问问自己:

  • 什么是保罗

  • 保罗的
    住宅
    属性设置为什么

  • 保罗的
    住所
    地址是什么


  • 提示:您不应该通过第2步。

    如果您将代码更改为:

    class Person {
        // actually create a residence object
        var residence: Residence? = Residence()
    }
    
    class Residence {
        // actually create a address object
        var address: Address? = Address()
    }
    
    class Address {
        // ...
    }
    
    let paul = Person()
    var addressNumber: Int?
    
    // Before Paul was never assigned a valid residence, now one will be created
    addressNumber = paul.residence?.address?.buildingNumber?.toInt()
    
    if let number = addressNumber {
        "correct"
    } else {
        "fault"
    }
    // gives you `correct`
    

    那么它应该工作得很好

    如果let number=addressNumber
    ,什么是
    ?那是作业吗?“fault”是否表示赋值失败?是的,首先,
    residence
    从未被赋值给一个非常明显的值。谢谢你,还有所有指出这一点的人@尼尔森-是的,没问题!我们每个人都会遇到这样那样的事情!