簡體   English   中英

是否可以在 Swift 中為類定義 setter

[英]Is it possible to define setters for a Class in Swift

我創建了一個無法完成的CurrentValueSubject版本,類似於@Published 但是,我想刪除對.send(value)的需要並為此類定義一個將執行該操作的設置器。 那可能嗎?

所以從這個:

customPublisher.send(newValue)

對此:

customPublisher = newValue
final class CustomPublisher<Output: Any>: Publisher {
    typealias Failure = Never

    var value: Output
    private var wrapper: CurrentValueSubject<Output, Failure>

    init(_ value: Output) {
        self.value = value
        wrapper = .init(value)
    }

    func send(_ value: Output) {
        self.value = value
        wrapper.send(value)
    }

    func send(subscription: Subscription) {
        wrapper.send(subscription: subscription)
    }

    func receive<S>(subscriber: S) where S: Subscriber, Failure == S.Failure, Output == S.Input {
        wrapper.receive(subscriber: subscriber)
    }
}

您不能使用語法customPublisher = newValue來發布新值,因為在該語法中,您將(可能是全新的)發布者放入customPublisher中。

不過,您可以使customPublisher.value = newValue起作用,就像CurrentValueSubject一樣。 您需要使用 setter 使value成為計算屬性,如下所示:

import Combine

final class CustomPublisher<Output: Any>: Publisher {
    private var wrapped: CurrentValueSubject<Output, Failure>

    typealias Failure = Never

    var value: Output {
        get { wrapped.value }
        set { wrapped.value = newValue }
    }

    init(_ value: Output) {
        wrapped = .init(value)
    }

    func send(_ value: Output) {
        wrapped.send(value)
    }

    func send(subscription: Subscription) {
        wrapped.send(subscription: subscription)
    }

    func receive<S>(subscriber: S) where S: Subscriber, Failure == S.Failure, Output == S.Input {
        wrapped.receive(subscriber: subscriber)
    }
}

暫無
暫無

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

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