2016-09-17 23 views
2

在我的銀行代碼(在一個框架),我伸出的UIColor支持乘法和加法運算這樣的:爲什麼我在Swift中使用自動生成的框架頭文件得到這個錯誤?

public protocol Interpolatable { 
    static func * (lhs: Self, rhs: Double) -> Self 
    static func + (lhs: Self, rhs: Self) -> Self 
} 
extension UIColor: Interpolatable { 
    public static func *(lhs: UIColor, rhs: Double) -> Self { 
     var r = CGFloat(0), g = CGFloat(0), b = CGFloat(0), a = CGFloat(0) 
     let t = CGFloat(rhs) 
     lhs.getRed(&r, green: &g, blue: &b, alpha: &a) 
     return self.init(red: r * t, green: g * t, blue: b * t, alpha: a * t) 
    } 
    public static func +(lhs: UIColor, rhs: UIColor) -> Self { 
     var lhsR = CGFloat(0), lhsG = CGFloat(0), lhsB = CGFloat(0), lhsA = CGFloat(0) 
     var rhsR = CGFloat(0), rhsG = CGFloat(0), rhsB = CGFloat(0), rhsA = CGFloat(0) 
     lhs.getRed(&lhsR, green: &lhsG, blue: &lhsB, alpha: &lhsA) 
     rhs.getRed(&rhsR, green: &rhsG, blue: &rhsB, alpha: &rhsA) 
     return self.init(red: lhsR + rhsR, green: lhsG + rhsG, blue: lhsB + rhsB, alpha: lhsA + rhsA) 
    } 
} 

如預期在操場或在一個獨立的項目,工作完美,但是當我把它在一個框架中的編譯器在框架頭部MyFramework-Swift.h生成此代碼:

@interface UIColor (SWIFT_EXTENSION(Animation)) 
+ (nonnull instancetype)*:(UIColor * _Nonnull)lhs :(double)rhs; 
+ (nonnull instancetype)+:(UIColor * _Nonnull)lhs :(UIColor * _Nonnull)rhs; 
@end 

而這種生成的代碼產生這樣的錯誤:

error: expected selector for Objective-C method 
+ (nonnull instancetype)*:(UIColor * _Nonnull)lhs :(double)rhs; 
         ^

(隨着對+運營商相同的錯誤)

我認爲這只是用來從Objective-C的訪問框架,因爲如果我直接刪除這個頭文件的內容我的項目建立和正常運行。

這是Xcode或Swift工具鏈中的一個皺摺,還是我錯過了我應該做的重載操作符這樣的事情?請注意,我對編譯器試圖做什麼感興趣,以及爲什麼這是一個問題,而不僅僅是解決方法的簡短答案或修復它。

+0

奇怪。我認爲它不應該包括Objective-C陸地上的定製操作符...... – nhgrif

回答

3

我終於弄清楚發生了什麼事,並對其進行了適當的修復。

這是怎麼回事:

當你創建一個框架,它需要被曝光的模塊,以便它是由代碼的其他部分使用。許多庫類(包括UIColor)實際上都是可以從Swift使用的Objective-C類,所以當您擴展它們時,默認設置也會使您的擴展在Objective-C中可用。編譯器爲您的框架生成Objective-C頭文件,將您的擴展名聲明爲Objective-C方法,在這種情況下,*+在Objective-C中不是有效的方法名稱,因此會導致編譯錯誤。

解決辦法:

要告訴你不希望這些方法是從Objective-C的訪問的編譯器,在方法聲明前加@nonobjc

@nonobjc public static func *(lhs: UIColor, rhs: Double) -> Self { 
...} 
@nonobjc public static func +(lhs: UIColor, rhs: UIColor) -> Self { 
...}