Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Swift中自动生成框架头时会出现此错误?_Swift_Xcode_Operator Overloading_Auto Generate - Fatal编程技术网

为什么在Swift中自动生成框架头时会出现此错误?

为什么在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:

在我的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: 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领域中的自定义操作符。。。