2014-10-15 15 views
5

phương pháp mảng phần mở rộng khác không có sẵn từ các module khác (ví dụ như các dự án XCTest)Mảng mở rộng gọi từ mô-đun

Vì lợi ích của sự đơn giản mã dưới đây không có gì nhưng nó có thể được sử dụng để sao chép các lỗi

import Foundation 

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

Gọi nó từ những tác phẩm mô-đun tương tự như kỳ vọng nhưng từ một lớp thử nghiệm không

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

tôi nghĩ rằng điều này là đúng bởi vì khả năng hiển thị phương pháp là restricte d để mô-đun riêng của mình, thực sự tôi có được lỗi '[String]' does not have a member named 'myMethod'

Tôi đã cố gắng để xác định phương pháp mở rộng như public như hình dưới đây

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

Nhưng tôi nhận được lỗi biên dịch 'Extension of generic type 'Array<T>' from a different module cannot provide public declarations'

Cho đến Beta 7 sử dụng public giải quyết được sự cố nhưng theo XCode 6.1 (6A1046a) Tôi nhận được lỗi này

Làm cách nào để khắc phục sự cố để chạy trong các mô-đun/dự án khác?

+0

Tại sao mở rộng Mảng khi bạn có thể khai báo một hàm cấp cao công khai? – mattt

+3

Bạn không thể khắc phục sự cố này. Swift 1.1 đã tắt các phần mở rộng công khai của các kiểu generic bên ngoài mô-đun của riêng bạn một cách rõ ràng bởi vì việc triển khai thực hiện không tốt nhất khi chúng cho phép nó. Radar cho sự trở lại của nó. – CodaFi

+0

@mattt đây chỉ là một ví dụ để tái tạo vấn đề, mã thực sử dụng các mục mảng sao cho nó hoàn hảo như phần mở rộng – dafi

Trả lời

3

Swift không cho phép tiện ích mở rộng công khai hiện tại, do đó bạn sẽ cần phải bao gồm tệp swift tiện ích mở rộng đó trong dự án của bạn và đặt nó một phần của mục tiêu.

1

Mặc dù không hoàn toàn giải quyết các câu hỏi ban đầu, tôi đã thấy rằng tôi có thể phương pháp khuyến nông thử nghiệm trong Swift 2.0 (Theo XCode 7.0) bằng cách nhập các mô-đun với các chỉ thị @testable:

@testable import MyGreatModule

+1

Hoàn toàn bỏ lỡ tính năng mới này Swift 2 ... cảm ơn! Điều này đã giải quyết được nhiều tai họa thử nghiệm của đồng nghiệp Swift-ers :) – mdstroebel

Các vấn đề liên quan