[英]Difference between (Type) and Type
目前,我正在編寫一個名為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:為什么? 如何從lhs
和rhs
構造ObjectIdentifier
?
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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.