0

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

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

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

类似这样(不起作用):

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

出现语法错误:“Getter/setter can only be defined for a single variable”

谢谢!

4

4 回答 4

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
于 2019-03-07T14:42:20.013 回答
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 }
}

signalsignalSenderare not的类型Signal<Bool, Error>。他们是任何pipe()回报。

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

于 2019-03-07T14:29:55.800 回答
0

只要单只接受一个变量,您就可以像这样声明变量,因此该变量将是元组。

protocol MyProtocol {

   var varName: Signal<(signal: Bool, signalSender: Error)> { get set }
}
于 2019-03-07T14:31:07.293 回答
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
}
于 2019-03-14T10:50:41.357 回答