2017-09-25 85 views
2

我開始使用Xcode 9上的推薦嚮導對具有Objc和Swift一起工作的項目遷移項目。Swift Swift 4遷移後的類別「無可見接口」錯誤

extension UIColor { 
    func doSomething(withAnotherColor color: UIColor) -> Bool { 
     return true 
    } 
} 

然後在一些Objc類:

具有以下UIColor擴展時,會出現問題

@implementation MyView 

    - (void)styleView { 
     //... some code 
     if ([someColor doSomethingWithAnotherColor:anotherColor]) { 
      ... 
     } 
    } 
@end 

if聲明拋出以下錯誤:../MyView.m: No visible @interface for 'UIColor' declares the selector 'doSomethingWithAnotherColor:'

我試着在擴展名和方法上使用@objc指令都沒有運氣。

注意這是一個編譯錯誤,不喜歡提到的其他問題,像這樣的警告:How can I deal with @objc inference deprecation with #selector() in Swift 4?

任何想法?

+3

您需要標記方法(或擴展)'@ objc';比較https://stackoverflow.com/q/44390378/2976878 – Hamish

+0

對不起,我試了很多東西,包括(你提到的)之前發佈的答案沒有運氣。 – Omer

+0

@matt只是修改瞭解釋這個不同的問題。 – Omer

回答

-1

實質上,@ matt的解決方案是正確的方法。在我的特定情況下,另一種事情發生

這裏的一些意見:

  • 無需前綴整個extension@objc,添加前綴功能只奏效了。
  • 正如在另一條評論中提到的那樣,我在發佈之前嘗試過,但沒有工作,但是由於@matt建議我決定刪除所有驅動數據,重新打開項目並再次嘗試,現在問題是另一回事點)
  • 顯然職能從斯威夫特Objc翻譯的方式已經改變了,我曾經有過:

斯威夫特(的UIColor類):

func doSomething(anotherColor: UIColor) -> Bool 

在objc更新之前,我是能夠:

[aColor doSomething:anotherColor]; 

但更新後,我需要將其更改爲:

[aColor doSomethingAnotherColor:anotherColor]; 

爲了保持使用功能Objc以同樣的方式,你可以改變斯威夫特功能:

func doSomething(_ anotherColor: UIColor) -> Bool 

這就是我最終的問題。 希望這可以幫助別人。

1

我在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) { 
}