Objective c &引用;“无可见界面”;swift 4迁移后的类别错误
我在Xcode 9上使用推荐的向导开始了一个项目的迁移,该项目同时拥有Objc和Swift 使用以下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 {
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的方式已经改变,我曾经:
[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) {
}