Быстрое объявление кортежа в протоколе - PullRequest
0 голосов
/ 07 марта 2019

В моем коде есть переменная кортежа, полученная из ReactiveSwift:

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

Как я могу объявить этот кортеж переменной в протоколе?

Похоже на это (не работает):

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

Появляется синтаксическая ошибка: «Получатель / установщик может быть определен только для одной переменной»

Спасибо!

Ответы [ 4 ]

3 голосов
/ 07 марта 2019

Тип вашего свойства должен быть кортежем, а не просто объявлением некоторого класса / структуры.Посмотрите, что возвращает ваш 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
0 голосов
/ 14 марта 2019

Вы можете просто определить свой протокол следующим образом:

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
}
0 голосов
/ 07 марта 2019

Вы можете объявить переменную следующим образом, пока переменная принимает только одну переменную, поэтому эта переменная будет кортежем.

protocol MyProtocol {

   var varName: Signal<(signal: Bool, signalSender: Error)> { get set }
}
0 голосов
/ 07 марта 2019

Ваше определение класса определяет два свойства, а затем назначает их из кортежа, но они по-прежнему являются двумя независимыми свойствами.Это можно увидеть, если вместо этого использовать синтаксис 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 }
}

Типы signal и signalSender не Signal<Bool, Error>.Это все, что pipe() возвращает.

Вы все еще можете согласовать этот протокол с синтаксисом, который использует MyClass.

...