web-dev-qa-db-ja.com

メソッドは、結果タイプをObjective-Cで表すことができないため、@ objcとしてマークできません

Swift Objective-CおよびObjective-CランタイムのAPI。

関数がエラーをスローする前に「@objc」を追加すると、「結果タイプをObjective-Cで表すことができないため、メソッドに@objcをマークできません」

私のコードはこちら

@objc public static func logIn(_ userId: String) -> User? { }

ユーザーはオプションの構造体です。これを解決する方法。

7
SriMa

情報の重要な部分は次のとおりです。

ユーザーはオプションの構造体です

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
    }
}
5

クラスの定義を次のように変更します

class User: NSObject {

}

このようにして、このクラスはObjective-Cで利用可能になります

2

クラスまたはプロトコルは、@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のオプションの値では機能しない場合があります。Userstructからclassに変更する必要があります

次のコードを試してみてください:

public class User : NSObject {
    // Your code
}

public final class Manager : NSObject {

    @objc public static func logIn(_ userId: String) -> User? {
        return nil
    }
}

これがエディター付きのスナップショットです

enter image description here

0
Krunal