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

更新

这也是我奇怪的分段错误集合https://gist.github.com/aleksgapp/795a2d428008bdfa4823

如果您对此有任何想法,请随时发表评论。

4

2 回答 2

7

更新(感谢 Laszlo Korte)

从带有 Swift 2.0 发行说明的 Xcode 7 Beta 2 开始:结构、枚举和协议的非可变方法现在可以部分应用于它们的“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)

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

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

于 2014-12-22T18:05:51.037 回答
3

所以,我无法解释它为什么会这样,但我确实找到了解决方法。尝试这个:

aString = { return a.someFunc() }
于 2014-09-09T14:04:48.820 回答