Swift 协议中的元组声明
Swift tuple declaration in a protocol
我的代码中有一个元组变量,它来自 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"
谢谢!
您的 class 定义定义了两个属性,然后恰好从一个元组中分配它们,但它们仍然是两个独立的属性。如果您改用 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()
returns.
您仍然可以使用 MyClass 使用的语法来遵守该协议。
你可以这样声明变量,只要single只接受一个变量,那么这个变量就是元组。
protocol MyProtocol {
var varName: Signal<(signal: Bool, signalSender: Error)> { get set }
}
你的 属性 类型应该是元组,而不仅仅是某些 class/struct 的声明。所以,看看你的 pipe()
return 是什么。它应该 return 具有两种类型的元组
func pipe() -> (Type1, Type2) { ... }
协议声明使用这两种类型
protocol MyProtocol {
var tuple: (signal: Type1, signalSender: Type2) { get set }
}
然后将此协议实施到您的 class 并为其分配 return 值 pipe()
class MyClass: MyProtocol {
var tuple: (signal: Type1, signalSender: Type2) = Signal<Bool, Error>.pipe()
}
然后当你需要获取元组的元素时,只需使用
tuple.signal
tuple.signalSender
您可以像这样简单地定义您的协议:
protocol MyProtocol {
associatedtype E: Error
var signal: Signal<Bool, E> {get}
var signalObserver: Signal<Bool, E>.Observer {get}
}
然后在你符合的 class:
class TestClass: MyProtocol {
var (signal, signalObserver) = Signal<Bool, NSError>.pipe() //you can replace NSError with your custom error type
}
我的代码中有一个元组变量,它来自 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"
谢谢!
您的 class 定义定义了两个属性,然后恰好从一个元组中分配它们,但它们仍然是两个独立的属性。如果您改用 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()
returns.
您仍然可以使用 MyClass 使用的语法来遵守该协议。
你可以这样声明变量,只要single只接受一个变量,那么这个变量就是元组。
protocol MyProtocol {
var varName: Signal<(signal: Bool, signalSender: Error)> { get set }
}
你的 属性 类型应该是元组,而不仅仅是某些 class/struct 的声明。所以,看看你的 pipe()
return 是什么。它应该 return 具有两种类型的元组
func pipe() -> (Type1, Type2) { ... }
协议声明使用这两种类型
protocol MyProtocol {
var tuple: (signal: Type1, signalSender: Type2) { get set }
}
然后将此协议实施到您的 class 并为其分配 return 值 pipe()
class MyClass: MyProtocol {
var tuple: (signal: Type1, signalSender: Type2) = Signal<Bool, Error>.pipe()
}
然后当你需要获取元组的元素时,只需使用
tuple.signal
tuple.signalSender
您可以像这样简单地定义您的协议:
protocol MyProtocol {
associatedtype E: Error
var signal: Signal<Bool, E> {get}
var signalObserver: Signal<Bool, E>.Observer {get}
}
然后在你符合的 class:
class TestClass: MyProtocol {
var (signal, signalObserver) = Signal<Bool, NSError>.pipe() //you can replace NSError with your custom error type
}