(类型)和类型之间的差异

时间:2016-04-07 09:29:49

标签: swift swift2

目前,我正在编写名为ControlControllable的类和协议。

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
  

无法为类型&#39; ObjectIdentifier&#39;调用初始值设定项。使用类型&#39;(T)&#39;

的参数列表

问题1:为什么?如何从ObjectIdentifierlhs构建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
  

无法为类型&#39; ObjectIdentifier&#39;调用初始值设定项。使用类型&#39;((可控))&#39;

的参数列表

问题2:(Controllable)元组吗?我该如何从元组中提取Controllable

对不起我的英文

1 个答案:

答案 0 :(得分:1)

ObjectIdentifier仅适用于对象和元类型作为构造函数中的参数。

符合Controllable的类型不符合ObjectIdentifier构造函数中的类型约束。

init(_ x: AnyObject)
init(_ x: Any.Type)

请参阅here

您希望为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
}