簡體   English   中英

swift 可選的泛型類型和嵌套的可選解包

[英]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可選那么你原來的代碼將實際工作,但你需要改變你傳遞你的價值在你的第二個例子的方式。

由於TString? , 你方法中的參數是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM