协议中的Swift元组声明

时间:2019-03-07 14:23:11

标签: swift reactive-programming reactive-swift

我的代码中有一个元组变量,它来自ReactiveSwift:

class MyClass {
   var (signal, signalSender) = Signal<Bool, Error>.pipe()
}

如何在协议中声明该变量元组?

类似这样(无效):

protocol MyProtocol {
   var (signal, signalSender): Signal<Bool, Error> { get set }
}

出现语法错误:“字母/字母只能定义为一个变量”

谢谢!

4 个答案:

答案 0 :(得分:3)

属性的类型应该是元组,而不仅仅是某些类/结构的声明。因此,请查看您的pipe()返回的内容。它应该返回两种类型的元组

func pipe() -> (Type1, Type2) { ... }

要使用两种声明来声明协议

protocol MyProtocol {
    var tuple: (signal: Type1, signalSender: Type2) { get set }
}

然后在您的类中实现此协议,并为它分配返回值pipe()

class MyClass: MyProtocol {
    var tuple: (signal: Type1, signalSender: Type2) = Signal<Bool, Error>.pipe() 
}

然后在需要获取元组元素时,只需使用

tuple.signal
tuple.signalSender

答案 1 :(得分:0)

您的类定义正在定义两个属性,然后碰巧是从一个元组分配它们,但是它们仍然是两个独立的属性。如果您改用init语法(您使用的语法只是为了方便起见),就可以看到以下内容:

class MyClass {
    var signal: ...
    var signalSender: ...

    init() {
        let (signal, signalSender) = Signal<Bool, Error>.pipe()
        self.signal = signal
        self.signalSender = signalSender
   }
}

您想要的是:

protocol MyProtocol {
    var signal: ... { get set }
    var signalSender: ... { get set }
}

signalsignalSender的类型不是Signal<Bool, Error>。它们就是pipe()返回的结果。

您仍然可以使用MyClass使用的语法来遵守该协议。

答案 2 :(得分:0)

您可以这样声明变量,只要单个变量仅接受一个变量,则此变量将为元组。

sendStatus

答案 3 :(得分:0)

您可以像这样简单地定义协议:

protocol MyProtocol {
    associatedtype E: Error
    var signal: Signal<Bool, E> {get}
    var signalObserver: Signal<Bool, E>.Observer {get}
}

,然后在您的课堂中:

class TestClass: MyProtocol {
    var (signal, signalObserver) = Signal<Bool, NSError>.pipe() //you can replace NSError with your custom error type
}