繁体   English   中英

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

[英]Difference between (Type) and Type

目前,我正在编写一个名为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

无法使用类型为“(T)”的参数列表调用类型“ObjectIdentifier”的初始值设定项

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM