[英]swift optional generic type and nested optional unwrapping
我有這段代碼
class MyObject<T> {
func start(_ value: T?) {
if let value = value {
doSomething(value)
}
}
func doSomething(_ value: T) {
print(value)
}
}
MyObject<String>().start("some")
// prints "some"
MyObject<String?>().start(nil)
// doesn't print anything
我需要為傳遞給start()
每個有效值調用doSomething()
start()
。 當T
已經是像String?
這樣的可選類型時String?
,則nil
是有效值。
我是否需要在MyObject
擴展中編寫兩個版本的start()
並帶有T
類型的條件? 以及怎么做?
你可以讓你的start
函數接受一個非可選的T
並且總是調用doSomething
而不是首先嘗試解包它。 如果T
本身是可選類型,這將只允許您調用start(nil)
:
class MyObject<T> {
func start(_ value: T) {
doSomething(value)
}
func doSomething(_ value: T) {
print(value)
}
}
MyObject<String>().start("some")
// prints "some"
MyObject<String?>().start(nil)
// prints "nil"
如果你想離開參數來start
可選那么你原來的代碼將實際工作,但你需要改變你傳遞你的價值在你的第二個例子的方式。
由於T
是String?
, 你方法中的參數是String??
並傳遞一個零String??
與傳遞一個String?
恰好包含nil
。
如果你稱之為:
MyObject<String?>().start(.some(nil))
或者
let string: String? = nil
MyObject<String?>().start(string)
然后它會打印“nil”
由於 let value = value 在第二個輸入時失敗,您需要單獨處理這種情況。
func start(_ value: T?) {
if let value = value {
doSomething(value)
}
else
{
print("nil input")
}
}
如果值為 nil,則解包時該值將不會進入 if 語句。 相反,您可以這樣做:
class MyObject<T> {
func start(_ value: T?) {
if let value = value {
doSomething(value)
} else {
print("nil")
}
}
func doSomething(_ value: T) {
print(value)
}
}
Swift 中的 Optional 只是一個通用枚舉,它有兩種情況:
enum Optional<T> {
case some(T)
case none
}
例如String?
與Optional<String>
。
如果你聲明MyObject<String?>
基本上你正在創建這個MyObject<Optional<String>>
,所以你的具體start
方法將是
func start(_ value: Optional<Optional<String>>) { ... }
這意味着如果你像start(nil)
一樣調用它,整個對象當然會是 nil 並且if let
會失敗。 但是,您可以通過這種方式調用該函數
MyObject<String?>().start(Optional.some(Optional.none))
MyObject<String?>().start(.some(.none)) // -> shorter version with type inference
基本上現在外部的 optional 存在並且 unwrap 工作,但內部的是nil
。
但是我仍然不明白為什么你需要做這樣的事情
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.