3 回答
TA貢獻1799條經驗 獲得超9個贊
您必須了解什么是可選的。許多Swift初學者認為var age: Int?,年齡是一個可能具有或沒有價值的Int。但這意味著年齡是一個可選參數,它可能包含也可能不包含一個整數。
在description()函數內部,您不打印Int,而是打印Optional。如果要打印Int,則必須解開Optional。您可以使用“可選綁定”解開可選:
if let a = age {
// a is an Int
}
如果確定Optional包含一個對象,則可以使用“強制展開”:
let a = age!
或者在您的示例中,由于您已經在description函數中測試了nil,因此您可以將其更改為:
func description() -> String {
return age != nil ? "\(name) is \(age!) years old." : "\(name) hides his age."
}
TA貢獻1898條經驗 獲得超8個贊
出于測試/調試的目的,我經常想將可選內容作為字符串輸出,而不必始終測試nil值,因此我創建了一個自定義運算符。
在閱讀了另一個問題的答案后,我甚至進一步改善了情況。
fileprivate protocol _Optional {
func unwrappedString() -> String
}
extension Optional: _Optional {
fileprivate func unwrappedString() -> String {
switch self {
case .some(let wrapped as _Optional): return wrapped.unwrappedString()
case .some(let wrapped): return String(describing: wrapped)
case .none: return String(describing: self)
}
}
}
postfix operator ~? { }
public postfix func ~? <X> (x: X?) -> String {
return x.unwrappedString
}
顯然,可以根據自己的喜好調整操作符(及其屬性),也可以將其設置為函數。無論如何,這使您可以編寫如下的簡單代碼:
var d: Double? = 12.34
print(d) // Optional(12.34)
print(d~?) // 12.34
d = nil
print(d~?) // nil
集成了其他人的協議思想后,它甚至可以與嵌套的可選對象一起使用,而嵌套可選對象通常在使用可選鏈接時發生。例如:
let i: Int??? = 5
print(i) // Optional(Optional(Optional(5)))
print("i: \(i~?)") // i: 5
添加回答
舉報
