目前,我正在编写名为Control
和的类和协议Controllable
。
Control
必须符合Controllable
。
Control
将具有其他数组Controllable
作为堆栈。每次添加Controllable
到堆栈之前,我都应该检查堆栈是否包含该元素。如果是,请将元素移到堆栈的顶部。
好的。VERSION_1:
import Foundation
protocol Controllable: Equatable {
}
func ==<T: Controllable>(lhs: T, rhs: T) -> Bool {
return ObjectIdentifier(lhs).uintValue == ObjectIdentifier(rhs).uintValue
}
class Control: Controllable {
static var mainControl = Control()
private init() {
}
private var stack: [Controllable] = []
func addToStack(controllable: Controllable) {
}
}
发生错误(Xcode 7.3):
return ObjectIdentifier(lhs).uintValue == ObjectIdentifier(rhs).uintValue
无法使用类型为(T)的参数列表来调用类型为ObjectIdentifier的初始化程序
问题1:为什么?如何ObjectIdentifier
从lhs
和构建rhs
?
VERSION_2:
import Foundation
protocol Controllable {
}
class Control: Controllable {
static var mainControl = Control()
private init() {
}
private var stack: [Controllable] = []
func addToStack(controllable: Controllable) {
stack.contains({ element in
return ObjectIdentifier(element).uintValue == ObjectIdentifier(controllable).uintValue
})
}
}
有一个错误(再次):
return ObjectIdentifier(element).uintValue == ObjectIdentifier(controllable).uintValue
无法使用类型为(((Controllable))'的参数列表来调用类型'ObjectIdentifier'的初始化程序
问题2:是(Controllable)
元组吗?我应该如何Controllable
从元组中提取?
对不起我的英语不好
ObjectIdentifier仅在对象和元类型上用作构造函数中的参数。
符合Controllable的类型不符合ObjectIdentifier构造函数中的类型约束。
init(_ x: AnyObject)
init(_ x: Any.Type)
看这里。
您想给ObjectIdentifier一个类型的元类型,例如String.self。或者,您想给ObjectIdentifier一个对象,例如“ hello”。您可以将对象约束添加到协议中,如下所示:
import Foundation
protocol Controllable: Equatable, AnyObject {
}
func ==<T: Controllable>(lhs: T, rhs: T) -> Bool {
return ObjectIdentifier(lhs).uintValue == ObjectIdentifier(rhs).uintValue
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句