2016-04-07 12 views
1

現在、私はControlControllableという名前のクラスとプロトコルを書いています。(タイプ)とタイプの違い

Controlは、Controllableに準拠している必要があります。

Controlは、スタックとして他の配列を有する。 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 

タイプの初期化子を呼び出すことはできませんが、 'ObjectIdentifier' タイプの引数リストで '(T')

質問1:なぜですか?どのようにすればObjectIdentifierlhsrhsから構成できますか?


VERSION_2:

return ObjectIdentifier(element).uintValue == ObjectIdentifier(controllable).uintValue 

タイプの引数リストに型 'ObjectIdentifier' 初期化子を呼び出すことはできません「(:(再度)エラーがあり

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 
     }) 
    } 
} 

(制御可能)) '

質問2:(Controllable)タプルですか?どのようにタプルからControllableを抽出する必要がありますか?私の英語

+1

'Controllable'だけをクラスに制限し、' === 'を使用したいと思われるのでしょうか?とにかく、最終的に配列を具体的な型として宣言しなければなりません。プロトコルではありません。 – Sulthan

答えて

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 
} 
関連する問題