从其他模块调用的数组扩展

时间:2014-10-15 16:14:47

标签: swift

其他模块(例如XCTest项目)

无法使用数组扩展方法

为简单起见,下面的代码什么也没做,但它可以用来重现错误

import Foundation

extension Array {
    mutating func myMethod(toIndex: Int) -> Int! {
        // no real code, it's here only to show the problem
        return 0
    }
}

从同一模块调用它可以按预期工作,但是从测试类中不能

class MyProjectTests: XCTestCase {
    func testMoveObjectsFromIndexes1() {
        var arr = ["000", "001", "002", "003"]
        arr.myMethod(0)
    }
}

我认为这是正确的,因为方法可见性仅限于其自己的模块,实际上我获得了错误'[String]' does not have a member named 'myMethod'

我尝试将扩展方法定义为public,如下所示

extension Array {
    public mutating func myMethod(toIndex: Int) -> Int! {
        // no real code, it's here only to show the problem
        return 0
    }
}

但是我得到了编译错误'Extension of generic type 'Array<T>' from a different module cannot provide public declarations'

直到Beta 7使用public解决了问题,但在XCode 6.1(6A1046a)下我得到了这个错误

如何修复它以在其他模块/项目下运行?

2 个答案:

答案 0 :(得分:3)

Swift目前不允许公共扩展,因此您需要在项目中包含该扩展swift文件并将其作为目标的一部分。

答案 1 :(得分:1)

虽然没有完全解决原始问题,但我确实发现我可以通过导入带有@testable指令的模块在Swift 2.0(在XCode 7.0下)测试扩展方法

@testable import MyGreatModule