22011


下記のようにプロトコルを適合した要素の配列に関する質問です。

下記のようなケースで配列のcontainsが使用できなくなるのですがこういった場合に  
配列に任意のobjectが含まれているかどうか判定する際の適切な方法が知りたいです。

正確には、contains(predicate: (XXX) throws -> Bool)しか利用できずcontains(element:
XXX)のファンクションが利用できなくなっています。  
indexOf関数でも同様のことが発生していました、

もちろん、

[code]

    private var array = [String]() 
    
[/code]

などで試した場合は問題ありませんでした。

[code]

    protocol ProtocolA : class {
        func someFunc()
    }
    
    class ClassA {
        private var array = [ProtocolA]()
    
        func testFunc(object: ProtocolA) {
            array.contains(object) // エラーになる
        }
    }
    
[/code]


CC BY-SA 3.0
2016-02-12T05:32:04.297
21997
2016-02-12T13:00:42.790
14376
question
ios swift xcode
swift2.0 プロトコルを適合した要素のArrayの扱いに関して


`contains(element: XXX)`はSequenceTypeのextensionとして、次のように定義されています。

[code]

    extension SequenceType where Generator.Element : Equatable {
        /// Return `true` iff `element` is in `self`.
        @warn_unused_result
        public func contains(element: Self.Generator.Element) -> Bool
    }
    
[/code]

この定義、要素型である`Generator.Element`は、`Equatable`プロトコルに「適合」している必要があります。(「継承」ではありません。)残念ながら現在のSwiftのプロトコルの仕様では、`Equatable`を継承したプロトコルは定義できても、`Equatable`に適合するプロトコルは定義できないようです。(やり方をご存知の方がおられましたら、お知らせください。)

あなたが見つけられたもう一つの`contains(predicate: (XXX) throws ->
Bool)`は以下のように定義されており、要素型に特定の条件はありません。

[code]

    extension SequenceType {
        /// Return `true` iff an element in `self` satisfies `predicate`.
        @warn_unused_result
        public func contains(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool
    }
    
[/code]

プロトコルを`:class`として定義してあれば、`===`演算子が使えますので、こちらの方の`contains`を使った方が確実なのではないかと思います。

[code]

    class ClassA {
        private var array = [ProtocolA]()
    
        func testFunc(object: ProtocolA) {
            array.contains{$0 === object}
        }
    }
    
[/code]

お試しください。


CC BY-SA 3.0
2016-02-12T13:00:42.790
22011
2016-02-12T13:00:42.790
13972
21997
answer