2014-09-05 2 views
8

Может кто-нибудь объяснить эту ошибку и почему это работает с закрытием?Частичное применение метода протокола не допускается

Если вы измените «Тест» на «А» внутри класса «В», все будет работать в обоих случаях.

бета 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

Также здесь моя странная коллекция вина сегментация https://gist.github.com/aleksgapp/795a2d428008bdfa4823

Не стесняйтесь комментировать, если у вас есть какие-то мысли по поводу любого.

+0

Поскольку Xcode7 beta 2 работает –

ответ

3

Итак, я не могу говорить с , почему ведет себя так, но я нашел обходное решение. Попробуйте это:

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

Работал для меня! Потрясающие. – DudeOnRock

7

UPDATE (благодаря Ласло Korte)

От Xcode 7 Beta 2 с Swift Notes 2.0 Release: методы Non-мутирует из структур, перечислений и протоколы могут теперь частично применяются к их параметру «self» .

Например:

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

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

оригинальный ответ (правильно для Xcode 6 с Swift 1.2)

Протокол может быть принят класс, структуры или перечисление. В последних двух случаях частичное применение метода структуры или перечисления не допускается, и вы получаете «Частичное применение метода протокола не допускается», поскольку a: Test может быть структурой или перечислением.

Другим словом является метод или функция, частично примененная curried method or function. Поэтому, когда вы пишете a.someFunc, вы пытаетесь частично применить этот метод, т. Е. Получить ссылку на закрытие, которое неявно содержит ссылку на a. Но структуры и перечисления не являются ссылочными типами, они являются типами значений и нет ссылки на a.

+0

Спасибо за отличное объяснение. Я думаю, что это печально. –

+1

С помощью Xcode7 beta 2 это теперь было изменено на работу: «Теперь не подлежащие мутации методы структур, перечислений и протоколов могут быть частично применены к их параметру« self » ». –

Смежные вопросы