如何避免使用!进行力解开的操作,因为使用此方法通常是错误的选择。
如下所示的代码中有什么更好的选择,使用它可以使代码看起来更简单,并且可以通过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
使用if let或guard构造:
if let
guard
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在新字符串中使用每个名称的。
description
考虑一下return firstName + " " +lastName。有关字符串插值可能返回意外结果的情况,
return firstName + " " +lastName