2014-06-12 19 views
16

Tôi đang gặp khó khăn khi liên kết khung của tôi với mã tận dụng khung công tác đó. Cụ thể, trình liên kết không thể tìm thấy các biểu tượng cho các phần mở rộng cho cấu trúc generics.Swift Framework không bao gồm các biểu tượng từ các phần mở rộng đến các cấu trúc chung

Đây là những gì một trong những phần mở rộng trông giống như cho Tùy chọn:

extension Optional { 
    /// Unwrap the value returning 'defaultValue' if the value is currently nil 
    func or(defaultValue: T) -> T { 
     switch(self) { 
      case .None: 
       return defaultValue 
      case .Some(let value): 
       return value 
     } 
    } 
} 

Phương pháp này hoạt động tuyệt vời trong một sân chơi hoặc trong một ứng dụng nếu mã được biên dịch trong phần chính của ứng dụng. Tuy nhiên, khi tôi cố gắng biên dịch này vào một khuôn khổ, ứng dụng (và thậm chí các cuộc thử nghiệm cho khung công tác) tạo ra mối liên kết lỗi sau:

Undefined symbols for architecture i386: "__TFSq2orU__fGSqQ__FQQ", referenced from: __TFC18SwiftPlusPlusTests27Optional_SwiftPlusPlusTests13testOrWithNilfS0_FT_T_ in Optional+SwiftPlusPlusTests.o

phương pháp tương tự như dưới đây, liên kết tốt (thông báo, nó không phải là trên generic)

extension String { 
    /// Returns a string by repeating it 'times' times 
    func repeat(times: Int) -> String { 
     var result = "" 
     for i in 0..times { 
      result += self 
     } 
     return result 
    } 
} 

có hai phần mở rộng khác trong kho lưu trữ của tôi trên github: SwiftPlusPlus mà cũng không liên kết (cả trên strucs generic). Bạn sẽ tái tạo các lỗi nếu bạn kéo cam kết mới nhất, xây dựng khung công tác, và sau đó thử chạy các bài kiểm tra đơn vị.

Cho đến giờ tôi đã thử chạy "chuỗi" trên khung công khai và tệp trung gian và tôi không thấy biểu tượng cho các tiện ích mở rộng này nhưng tôi thấy biểu tượng cho tiện ích mở rộng repeat trên String. Vì vậy, nó thậm chí không có vẻ được biên dịch chúng vào thư viện.

Có ai biết tại sao các biểu tượng không được xác định trong khuôn khổ không?

Sửa

  • Here là một liên kết đến mở rộng tùy chọn của tôi
  • Here là một liên kết đến tập tin thử nghiệm khiến các mối liên kết lỗi khi cố gắng để biên dịch các mục tiêu thử nghiệm
+0

BTW, nó được gọi chung chung thay vì mẫu trong Swift –

+0

@BryanChen oh cuộc gọi tốt, tôi sẽ cập nhật câu hỏi của tôi, nhờ – drewag

+0

bạn có thể liên kết đến các lớp được định nghĩa trong khung của bạn? và bạn có thể cần 'nhập YourFramworkModuleName' –

Trả lời

9

Tôi posted on the Apple Developer forums và nhân viên của Apple đã trả lời rằng đây là lỗi đã biết.

It looks like the compiler gets the mangled symbol names of methods in generic extensions wrong when they live in a different framework.

2

Trong trường hợp bạn đang tìm kiếm một giải pháp tạm thời, bạn có thể quấn phần mở rộng trong một phương pháp học:

// In your framework 
public class OptionalOperator { 
    public class func or<T>(optional:Optional<T>,defaultValue:T) ->T { 
     return optional.or(defaultValue) 
    } 
} 

// Outside the framework 
var maybeText:String? 
let text = OptionalOperator.or(maybeText, defaultValue: "Apple, please fix this") 

Tất nhiên, đây không phải là lý tưởng và đánh bại mục đích của phần mở rộng. Vì vậy, nếu bạn định gọi phương thức này thường xuyên, chúng tôi có thể overload/define an operator.

// In your framework 
infix operator ||| {} 

public func |||<T>(left:Optional<T>, right:T) -> T { 
    return left.or(right) 
} 

// Outside the framework 
var maybeText:String? 
let text = maybeText ||| "Apple, please fix this" 

Trong trường hợp của tôi, tôi có nhiều ứng dụng sử dụng khung làm việc, vì vậy tôi muốn duy trì phương pháp triển khai phương pháp trong khuôn khổ. Tuy nhiên, quá tải một toán tử (hoặc chỉ sử dụng một hàm toàn cầu) sẽ là khó xử, vì vậy tôi phải đi với tùy chọn đầu tiên cho đến khi lỗi đó được sửa.

Hy vọng điều này sẽ hữu ích.

CẬP NHẬT

Funny điều là Swift đã có một nhà điều hành cho rằng (??).

var maybeText:String? 
let text = maybeText ?? "Nice!" 

Nó được gọi là - Nil coalescing hành

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