Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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
Objective c &引用;“无可见界面”;swift 4迁移后的类别错误_Objective C_Swift_Xcode9 - Fatal编程技术网

Objective c &引用;“无可见界面”;swift 4迁移后的类别错误

Objective c &引用;“无可见界面”;swift 4迁移后的类别错误,objective-c,swift,xcode9,Objective C,Swift,Xcode9,我在Xcode 9上使用推荐的向导开始了一个项目的迁移,该项目同时拥有Objc和Swift 使用以下UIColor扩展名时会出现问题: extension UIColor { func doSomething(withAnotherColor color: UIColor) -> Bool { return true } } 然后在某些Objc类上: @implementation MyView - (void)styleView {

我在Xcode 9上使用推荐的向导开始了一个项目的迁移,该项目同时拥有Objc和Swift

使用以下
UIColor
扩展名时会出现问题:

extension UIColor {
    func doSomething(withAnotherColor color: UIColor) -> Bool {
        return true
    }
}
然后在某些Objc类上:

@implementation MyView

    - (void)styleView {
        //... some code
        if ([someColor doSomethingWithAnotherColor:anotherColor]) {
            ... 
        }
    }
@end
if
语句抛出以下错误:
。/MyView.m:No visible@interface for'UIColor'声明选择器'doSomethingWithAnotherColor:'

我尝试在扩展和方法上使用
@objc
指令,但没有成功

请注意,这是一个编译错误,而不是在其他问题上提到的警告,例如:


有什么想法吗?

本质上,@matt的解决方案是正确的方法。就我的具体情况而言,另一件事正在发生

以下是一些评论:

  • 不需要在整个
    扩展名
    前面加上
    @objc
    ,将前缀添加到函数只会起到作用
  • 正如在另一条评论中提到的,我在发布之前尝试过这个方法,但不起作用,但由于@matt建议,我决定删除所有驱动数据,重新打开项目并再次尝试,现在问题是另一回事(下一点)
  • 显然,函数从Swift转换为Objc的方式已经改变,我曾经:
Swift(UIColor类别):

在更新之前的objc中,我能够:

[aColor doSomething:anotherColor];
但在更新之后,我需要将其更改为:

[aColor doSomethingAnotherColor:anotherColor];
为了在Objc中以相同的方式使用该函数,您可以将Swift函数更改为:

func doSomething(_ anotherColor: UIColor) -> Bool
这就是我这边的全部问题。
希望这对其他人有所帮助。

我通过在swift函数的
@objc
注释中显式指定方法签名解决了这个问题

// Swift codes

@objc(myNoArgFunc) // need to specify even if the obj-c method name is the same as the swift name
func myNoArgFunc() {
}

@objc(myFuncWithArg1:arg2:arg3:) // note the last :
func myFunc(_ arg1: String, arg2: String, arg3: int) {
}

您需要标记方法(或扩展)
@objc
;比较抱歉,在发布答案之前,我尝试了很多事情,包括(你提到的),但运气不好。@matt刚刚修改了问题,解释了这有什么不同。@Hamish是正确的,没有
@objc
;即使你声称你已经试过了,但问题中的代码中没有,因此这将是任何人在看这个问题时首先想到的,因为删除
@objc
推理是Swift 4中的主要变化,这将影响Swift和Obj-C之间的交互。至于你的特殊问题,我可能建议清理和重建项目,以强制在添加
@objc
后重新创建生成的头。如果这不能解决问题,请查看生成的头本身,并查看您的方法是否出现在那里。另外,很明显,请确保您的Objective-C源文件是
#import
ing头文件。最后一个下划线“奇怪的技巧”对我很有用,谢谢。
// Swift codes

@objc(myNoArgFunc) // need to specify even if the obj-c method name is the same as the swift name
func myNoArgFunc() {
}

@objc(myFuncWithArg1:arg2:arg3:) // note the last :
func myFunc(_ arg1: String, arg2: String, arg3: int) {
}