[英]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
當主體還沒有收到其他值時發送給觀察者的初始值。
其中Element
是BehaviorSubject
的占位符類型:
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 時,您可能需要考慮另一種類型。 由於您希望您的主題僅在開始時為空,我建議使用ReplaySubject
或PublishSubject
。
在 RxSwift 的 GitHub 問題頁面上也提出了類似的問題。 允許沒有初始值的 BehaviorSubject 。 在那里,kzaher 建議使用ReplaySubject
。
然后,您的主題將看起來像這樣,沒有任何初始值並且 MyData 不是Optional
。
let subject = ReplaySubject<MyData>().create(bufferSize: 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.