1

Swift 2 (Xcode 7b4) で動作すると思われるコードをいくつか書きましたが、コンパイルされていませ。私がやろうとしていることが有効であるかどうかについて、いくつかの考えを得たいと思っています。

Array次の拡張例を検討してください。

extension Array where Element: AnyObject {
    mutating func appendUniqueInstance(e: Element) {
        for element in self {
            if (element === e) {
                return
            }
        }

        self.append(e)
    }
}

まず、要素が である配列とはどういう意味AnyObjectですか? 基本的に、配列には、インスタンスの等価性 ( ) を比較できる非値型オブジェクトの異種グループを含める必要があると言っています===

例の関数appendUniqueInstance()は、要素がまだ配列にない場合にのみ、要素を配列に挿入します。これは操作に似ていますが、明らかに順序付けを提供し、(さらに重要なことに)の同種型要件をSet insert()課しません(の の使用による)。SetEquatableSelf

を実装するプロトコルPとクラスを定義すると、次のようになります。CP

protocol P : AnyObject {}

class C : P {}

をインスタンス化しますC:

let c = C()

次に、これらの非常に明白なことが真実です。

let cIsAnyObject = c as AnyObject   // ok
let cIsP = c as P                   // ok

そして、次のことができるようになりました。

var a1 = [AnyObject]()              // []

a1.appendUniqueInstance(c)          // [c]
a1.appendUniqueInstance(c)          // [c]

ここまでは順調ですが、問題のケースについては次のとおりです。

var a2 = [P]()

a2.append(c)                        // ok, -> [c]

// Compiler error: Cannot invoke 'appendUniqueInstance' with an argument list of type '(C)'
a2.appendUniqueInstance(c)

ここで、a2は の配列として型付けされているため、 のインスタンスPに対して行うことは完全に有効なはずであり、実際に行は期待どおりに機能します。appendPa2.append(c)

Arrayただし、拡張関数を呼び出すとappendUniqueInstance()、コンパイラ エラーが発生します。

私が知る限り、コンパイラは何に渡すことができるかについて混乱しているようappendUniqueInstance()で、C(via P) がAnyObject.

Pちなみに、代わりに次のように宣言すると:

@objc protocol P : AnyObject {}

その後、すべてが正常にコンパイルされますが、プロトコルのすべてが にP準拠していることも確認する必要があります@objc。これは私が望んでいるものではありません。

結局のところ、私の質問は次のとおりです。これはうまくいくように見えますか? 宣言の構文が間違っているだけではないことを願っていますが、そうであればうれしいと思います。

4

2 に答える 2

0

コマンドをクリックするAnyObject と、@objc に準拠したプロトコルであることがわかります。それが @objc の使用を要求する理由だと思います。PC を NSObject のサブクラスにすると、 @objc に準拠するメソッドの実装を明示的に作成する必要がないことに気付きました

@objc protocol P : AnyObject {
    func hey()
}

class C : NSObject, P {
    func hey() {
        print("hey")
    }
}
于 2016-02-09T15:39:52.090 に答える
0

元の質問を書いたときにコンパイラによって報告されたエラーは単に誤解を招くものだったようで、取得しようとしていた機能は Swift でサポートされていませんでした (そしてまだサポートされていません)。

Xcode 8.2.1 および Swift 3 では、より正確なエラーが報告されます。

// error: using 'P' as a concrete type conforming
//   to protocol 'AnyObject' is not supported
a2.appendUniqueInstance(c)
于 2017-02-26T17:44:06.223 に答える