有人可以解释这个错误,为什么这适用于关闭? 如果你在’B’类中将’Test’更改为’A’,那么在这两种情况下一切都有效. beta 7 protocol Test { func someFunc() - String var someClosure: () - Int { get
如果你在’B’类中将’Test’更改为’A’,那么在这两种情况下一切都有效.
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
这里还有我奇怪的分段故障集合https://gist.github.com/aleksgapp/795a2d428008bdfa4823
如果你有任何想法,请不要犹豫.
更新(感谢Laszlo Korte)From Xcode 7 Beta 2 with Swift 2.0 Release Notes: Non-mutating methods
of structs, enums, and protocols may now be partially applied to their
“self” parameter.
例如:
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)
协议可以通过类,结构或枚举来采用.在最后两种情况下,不允许部分应用结构或枚举方法,并且你得到“不允许部分应用协议方法”,因为a:测试可以是结构或枚举.
换句话说,部分应用的方法或功能是咖喱方法或功能.因此,当您编写a.someFunc时,您尝试部分应用此方法,即获取对隐式持有对a的引用的闭包的引用.但是结构和枚举不是引用类型,它们是值类型,并且没有引用.