簡體   English   中英

使用 Swift 時出現錯誤“nil 需要上下文類型”

[英]Error "nil requires a contextual type" using Swift

我想在代碼中實現以下目標:

class MyService {

    let mySubject = BehaviorSubject<MyData>(value: nil)

    //....

}

不幸的是,我收到“nil 需要上下文類型”錯誤。 我希望主題是“空的”,直到我真正把東西放在那里。 那么我怎樣才能將 nil 作為參數傳遞呢? 我可以將它轉換為我自己的類型以使其工作嗎?

基於RxSwift BehaviorSubject的參考init(value:)初始化器被聲明為

public init(value: Element)

其中value參數描述為:

value

當主體還沒有收到其他值時發送給觀察者的初始值。

其中ElementBehaviorSubject的占位符類型:

 public final class BehaviorSubject<Element> ...

這意味着如果您要能夠將初始值(在沒有收到其他值時使用)設置為nil ,則需要將占位符類型Element指定為Optional類型。 例如:

class MyService {

    let mySubject = BehaviorSubject<MyData?>(value: nil)

    //....
}

或者,讓編譯器將占位符推斷為MyData? 通過對nil參數使用不加糖的.none形式:

class MyService {

    let mySubject = BehaviorSubject(value: Optional<MyData>.none)

    //....
}

為了更好地理解實際的錯誤消息,請考慮以下獨立示例:

struct Foo<T> {
    init(value: T) {}
}

struct Bar {}

let bar = Bar()

_ = Foo<Bar>(value: bar)           // OK
_ = Foo(value: bar)                // OK, T inferred as Bar
_ = Foo<Bar>(value: nil)           // Error: error: 'nil' requires a contextual type
_ = Foo<Bar?>(value: nil)          // OK
_ = Foo(value: Optional<Bar>.none) // OK, T inferred as Bar?

雖然dfri 的回答在技術上是正確的,但在使用 RxSwift 時,您可能需要考慮另一種類型。 由於您希望您的主題僅在開始時為空,我建議使用ReplaySubjectPublishSubject

在 RxSwift 的 GitHub 問題頁面上也提出了類似的問題。 允許沒有初始值的 BehaviorSubject 在那里,kzaher 建議使用ReplaySubject

然后,您的主題將看起來像這樣,沒有任何初始值並且 MyData 不是Optional

let subject = ReplaySubject<MyData>().create(bufferSize: 1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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