2014-09-05 7 views
8

Kann jemand diesen Fehler erklären und warum funktioniert das mit Schließung?Partielle Anwendung der Protokollmethode ist nicht erlaubt

Wenn Sie "Test" in "A" in Klasse "B" ändern, funktioniert alles in beiden Fällen.

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

UPDATE

hier auch meine seltsame Segmentation fault Sammlung https://gist.github.com/aleksgapp/795a2d428008bdfa4823

nicht zu kommentieren Zögern Sie, wenn Sie ein paar Gedanken über irgendwelche haben.

+0

Seit Xcode7 Beta 2 funktioniert das –

Antwort

3

Also kann ich nicht mit sprechen warum es verhält sich so, aber ich habe eine Abhilfe gefunden. Versuchen Sie folgendes:

aString = { return a.someFunc() } 
+0

Arbeitete für mich! Genial. – DudeOnRock

7

UPDATE (dank Laszlo Korte)

Von Xcode 7 Beta 2 mit Swift 2.0 Release Notes: Nicht mutiert Methoden von Strukturen, Aufzählungen und Protokolle können jetzt teilweise auf ihre "self" -Parameter angewendet werden.

Zum Beispiel:

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

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

ORIGINAL ANTWORT (richtige für Xcode 6 mit Swift 1,2)

Protokoll nach Klasse übernommen werden kann, Struktur oder Aufzählung. In den letzten beiden Fällen ist die teilweise Anwendung der Struktur- oder Aufzählungsmethode nicht erlaubt und Sie erhalten "Partielle Anwendung der Protokollmethode ist nicht erlaubt", da a: Test Struktur oder Aufzählung sein kann.

Teilweise angewandte Methode oder Funktion ist mit anderen Worten curried method or function. Wenn Sie also a.someFunc schreiben, versuchen Sie, diese Methode teilweise anzuwenden, d. H. Erhalten Sie einen Verweis auf den Abschluss, der implizit den Verweis auf a enthält. Aber Strukturen und Aufzählungen sind keine Referenztypen, sie sind Werttypen und es gibt keinen Verweis auf a.

+0

Danke für die tolle Erklärung. Ich denke aber, dass es traurig ist. –

+1

Mit Xcode7 Beta 2 wurde dies geändert, um jetzt zu arbeiten: "Nicht-mutierende Methoden von Strukturen, Aufzählungen und Protokollen können nun teilweise auf ihren" selbst " Parameter angewendet werden." –

Verwandte Themen