Swift 如何使用@Published和map?

Swift 如何使用@Published和map?,swift,combine,Swift,Combine,我想将@Published属性包装器与映射结合使用,但出现以下编译器错误: 无法将“Publisher.Map”类型的返回表达式转换为“Published.Publisher”类型的返回表达式 我怎样才能做到这一点呢?你可以这样解决:通过链接value和isZero。每次值更新为零时,也将更新: protocol ZeroChecking { var isZeroPublisher: Published<Bool>.Publisher { get } } class Nu

我想将
@Published
属性包装器与
映射
结合使用,但出现以下编译器错误:

无法将“Publisher.Map”类型的返回表达式转换为“Published.Publisher”类型的返回表达式


我怎样才能做到这一点呢?

你可以这样解决:通过链接value和isZero。每次值更新为零时,也将更新:

protocol ZeroChecking {

    var isZeroPublisher: Published<Bool>.Publisher { get }
}

class Number: ObservableObject, ZeroChecking {


    @Published var value: Int = 1
    @Published private(set) var isZero: Bool = false
    lazy var isZeroPublisher: Published<Bool>.Publisher = $isZero

    public init() {
        $value
            .map { $0 == 0 }
            .assign(to: &$isZero)
    }

}
协议零点检查{
var isZeroPublisher:Published.Publisher{get}
}
类编号:ObserveObject,零检查{
@已发布的变量值:Int=1
@发布的私有(集合)变量为零:Bool=false
lazy var isZeroPublisher:Published.Publisher=$isZero
公共init(){
美元价值
.map{$0==0}
.分配(到:&$isZero)
}
}

您几乎可以定义一个计算属性,该属性返回一个发布者,该发布者映射由
@Published
发出的值,但它不应该是
已发布的。发布者
类型-它应该只由
AnyPublisher
类型:

@Published private var aNumber: Int = 1

var theNumberIsZero2: AnyPublisher<Bool, Never> {
   $aNumber.map { $0 == 0 }
           .eraseToAnyPublisher()
}
@已发布的私有变量编号:Int=1
var theNumberIsZero2:AnyPublisher{
$aNumber.map{$0==0}
.删除任何发布者()
}

感谢您的回答,但这种方法不允许我在协议中使用此变量,这就是我希望使用的原因。publisherI已更新我的答案以包括协议。感谢您的回答,但我想指出我的问题中有关同步使用映射属性的部分:)我会因此而失去那份利益approach@Dr.Mr.Uncle,同步使用mapped属性是什么意思?能否添加一个代码示例来说明该用例?
protocol ZeroChecking {

    var isZeroPublisher: Published<Bool>.Publisher { get }
}

class Number: ObservableObject, ZeroChecking {


    @Published var value: Int = 1
    @Published private(set) var isZero: Bool = false
    lazy var isZeroPublisher: Published<Bool>.Publisher = $isZero

    public init() {
        $value
            .map { $0 == 0 }
            .assign(to: &$isZero)
    }

}
@Published private var aNumber: Int = 1

var theNumberIsZero2: AnyPublisher<Bool, Never> {
   $aNumber.map { $0 == 0 }
           .eraseToAnyPublisher()
}