为什么在Swift中自动生成框架头时会出现此错误?
在我的Swift代码(在框架中)中,我扩展了UIColor以支持如下乘法和加法运算符:为什么在Swift中自动生成框架头时会出现此错误?,swift,xcode,operator-overloading,auto-generate,Swift,Xcode,Operator Overloading,Auto Generate,在我的Swift代码(在框架中)中,我扩展了UIColor以支持如下乘法和加法运算符: public protocol Interpolatable { static func * (lhs: Self, rhs: Double) -> Self static func + (lhs: Self, rhs: Self) -> Self } extension UIColor: Interpolatable { public static func *(lhs:
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工具链中的一个折痕,还是我在重载这样的操作符时遗漏了应该做的事情?请注意,我感兴趣的是编译器正在尝试做什么,以及为什么这是一个问题,而不仅仅是解决方法或修复它的简短答案。我最终找到了发生的事情和正确的修复方法 发生了什么事: 创建框架时,需要将其作为模块公开,以便其他代码段可以使用它。许多库类(包括
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 {
...}
奇怪。我认为它根本不应该包括Objective-C领域中的自定义操作符。。。