一尘不染

如何避免强制展开变量?

swift

如何避免使用!进行力解开的操作,因为使用此方法通常是错误的选择。

如下所示的代码中有什么更好的选择,使用它可以使代码看起来更简单,并且可以通过if检查变量!被调用永远不会为零,因此不会崩溃。

我的教练向我们介绍了bang(!)运算符,然后告诉我们不要再使用它了。告诉我们原因,如果可选为nil,它将使我们的应用程序崩溃。

但是,我发现自己处于类似bang运算符似乎是最简洁和最安全的选择的情况。

func fullName() -> String {
    if middleName == nil {
        return "\(firstName) \(lastName)"
    }else{
        return "\(firstName) \(middleName!) \(lastName)"
    }
}

有没有更好的方法来做这样的事情?

此外,如果有人想知道,这里是完整的课堂。

class CPerson{
    var firstName: String
    var middleName: String?
    var lastName: String

    init(firstName: String, middleName: String?, lastName: String) {
        self.firstName = firstName
        self.middleName = middleName
        self.lastName = lastName
    }
    convenience init(firstName: String, lastName: String) {
        self.init(firstName: firstName, middleName: nil, lastName: lastName)
    }
    func fullName() -> String {
        if middleName == nil {
            return "\(firstName) \(lastName)"
        }else{
            return "\(firstName) \(middleName!) \(lastName)"
        }
    }
}

我的教练说:“如果我看到您使用bang运算符,我们将进行战斗” O_O


阅读 210

收藏
2020-07-07

共1个答案

一尘不染

使用if letguard构造:

func fullName() -> String {
    if let middleName = middleName {
        return "\(firstName) \(middleName) \(lastName)"

    } else {
        return "\(firstName) \(lastName)"
    }
}

func fullName() -> String {
    guard let middleName = middleName else {
        return "\(firstName) \(lastName)"
    }
    return "\(firstName) \(middleName) \(lastName)"
}

guard出于完整性考虑而放置了该语句,但正如其他人所评论的那样,这在错误/故障情况下更常用。

我也建议不要对字符串使用字符串插值。它们已经是字符串,因此无需description在新字符串中使用每个名称的。

考虑一下return firstName + " " +lastName。有关字符串插值可能返回意外结果的情况,

2020-07-07