methods - protocol - extension override swift



プロトコルメソッドの部分的なアプリケーションは許可されていません (2)

誰かがこのエラーを説明して、なぜこれがクロージャーで動作するのですか?

'Test'を 'B'クラスの中の 'A'に変更すると、両方の場合にすべてが機能します。

ベータ7

protocol Test {
    func someFunc() -> String
    var someClosure: () -> Int { get }
}

class A: Test {
    func someFunc() -> String {
        return "A String"
    }

    var someClosure: () -> Int {
        return {
            return 2
        }
    }
}

class B {
    let a: Test
    let aString: () -> String
    let aInt: () -> Int

    init(a: Test){
        self.a = a

        aString = a.someFunc // Error: Partial application of protocol method is not allowed
        aInt = a.someClosure // Works fine
    }
}

更新

また私の奇妙なセグメンテーションフォールトコレクションはここにありますhttps://gist.github.com/aleksgapp/795a2d428008bdfa4823

あなたが何かについての考えを持っているならば、コメントするのをためらってください。

https://src-bin.com


Answer #1

だから、 なぜこのように動作するの話すことはできませんが、回避策が見つかりました。 これを試して:

aString = { return a.someFunc() }

Answer #2

更新 (Laszlo Korteに感謝します)

Xcode 7 Beta 2からSwift 2.0リリースノート:構造体、列挙型、プロトコルの非突然変異メソッドが、現在は "self"パラメータに部分的に適用されるようになりました。

例えば:

let a: Set<Int> = [1, 2] 
let b: [Set<Int>] = [[1], [3]]

b.map(a.union) // [[1, 2], [1, 2, 3]]

元の回答 (Swift 1.2のXcode 6で正しい)

プロトコルは、クラス、 構造または列挙によって採用することができます。 最後の2つのケースでは、構造体または列挙型メソッドの部分的なアプリケーションは許可されていないためa: Test 「プロトコルメソッドの部分的なアプリケーションは許可されていません」という理由で取得できます。

部分的に適用される方法または機能は、言い換えれば、 curried method or function 。 したがって、 a.someFuncを書くときには、このメソッドを部分的に適用しようとします。つまり、暗黙的にaa参照を保持するクロージャへの参照を取得します。 しかし、構造体と列挙型は参照型ではなく、値型でありaへの参照はありません。





xcode6-beta7