(类型)和类型之间的区别

GRiMe2D

目前,我正在编写名为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:为什么?如何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

无法使用类型为(((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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章