2014-09-05 48 views
8

有人可以解释这个错误,为什么这与闭包工作?协议方法的部分应用不允许

如果您在'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 
    } 
} 

UPDATE

而且,这里是我的奇怪的分段错误收集https://gist.github.com/aleksgapp/795a2d428008bdfa4823

不要犹豫,如果你有任何的一些想法进行评论。

+0

由于Xcode7 beta 2这是工作 – 2015-07-07 08:13:57

回答

3

所以,我不能说为什么它的行为如此,但我找到了解决方法。 尝试此:

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

为我工作!真棒。 – DudeOnRock 2014-11-22 21:42:19

7

UPDATE(感谢的Laszlo Korte的)

在Xcode 7测试2与夫特2.0版本说明:非突变的方法结构,枚举的 ,和协议可以现在部分适用于他们的 “self”参数。

例如:

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

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

原来的答案(校正的Xcode 6夫特1.2)

协议可以通过类,结构枚举通过。在最后两种情况下,不允许部分应用结构或枚举方法,因为a: Test可以是结构或枚举,因此您将得到“不允许部分应用协议方法”。

换句话说,部分应用的方法或功能是​​。因此,当您编写a.someFunc时,您尝试部分应用此方法,即获取引用到隐含地引用a的引用。但结构和枚举不是引用类型,它们是值类型,并且没有引用a

+0

感谢您的好解释。我觉得这很难过。 – 2015-05-19 16:03:24

+1

随着Xcode7 beta 2的发布,现在已经发生了变化:“结构,枚举和协议的非变异方法现在可能部分应用于其”自我“参数 。” – 2015-07-07 08:13:06