Swift Objective-CおよびObjective-CランタイムのAPI。
関数がエラーをスローする前に「@objc」を追加すると、「結果タイプをObjective-Cで表すことができないため、メソッドに@objcをマークできません」
私のコードはこちら
@objc public static func logIn(_ userId: String) -> User? { }
ユーザーはオプションの構造体です。これを解決する方法。
情報の重要な部分は次のとおりです。
ユーザーはオプションの構造体です
User
が構造体の場合、Objective-Cで表すことはできません。これは、NSObject
から継承しないSwiftクラスと同じです。
メソッドlogIn(_:)
を@objc
としてマークするには、メソッド宣言で参照されるすべての型がObjective-Cで表現可能である必要があります。 User
がそうではないため、エラーメッセージが表示されます。
修正するには、User
の宣言を以下から変更する必要があります。
struct User {
// ...
}
...これに:
class User: NSObject {
// ...
}
...またはUser
を返さないようにlogIn(_:)
を再設計します。
これに関する詳細情報を見つけることができます こちら 。特に、 この答え は次の解決策を提供します。
私が見つけた最高のことは、ボックスクラスでラップすることでした
public class Box<T>: NSObject { let unbox: T init(_ value: T) { self.unbox = value } }
クラスの定義を次のように変更します
class User: NSObject {
}
このようにして、このクラスはObjective-Cで利用可能になります
クラスまたはプロトコルは、@objc
表記のコード(関数)を含むNSObject
またはその階層の他のクラスによって継承(拡張)する必要があります。
例:
class TestClass {
public static func logIn(_ userId: String) -> User? { }
}
この関数で@objc
を使用/宣言するには、クラスがNSObject
(またはその階層内の他のクラス)を拡張する必要があります
class TestClass {
@objc public static func logIn(_ userId: String) -> User? { }
}
回避策として、struct
はObjective-Cのオプションの値では機能しない場合があります。User
をstruct
からclass
に変更する必要があります
次のコードを試してみてください:
public class User : NSObject {
// Your code
}
public final class Manager : NSObject {
@objc public static func logIn(_ userId: String) -> User? {
return nil
}
}
これがエディター付きのスナップショットです