簡體   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