web-dev-qa-db-ja.com

@objc属性を持つプロトコルでカスタムクラスを使用できませんか?

JSONロード委任用のプロトコルJSONLoaderDelegateを作成しようとしています。 JSONLoaderと呼ばれる他のクラスは、次のように(JSONLoaderDelegateプロトコルを実装する)デリゲートにイベントをディスパッチすることになっています。

self?.delegate?.jsonLoaderdidEndWithError(self!, error: JSONLoaderError.LoadError)

JSONLoaderの実装はそれほど重要ではありません(imho)。しかし、私はプロトコルを実装するのに問題があるようです、これはコードです:

@objc protocol JSONLoaderDelegate {

    optional func jsonLoaderdidBeginLoading(jsonLoader: JSONLoader)
    func jsonLoaderdidEndWithError(jsonLoader: JSONLoader, error: JSONLoader.JSONLoaderError)
    func jsonLoaderDidEndWithSuccess(jsonLoader: JSONLoader)

}

これは私にはかなり簡単に見えますが、エラーが発生します:

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

3つの機能すべてを指し示しました。

明らかに、@objc属性を削除すると、関数にoptionalを使用できなくなります。 jsonLoaderdidBeginLoadingをオプションとして残しておきたいと思います。これを解決するためのアイデア/方法はありますか?ありがとうございました!

11
Fygo

3つの方法に共通しているのは、JSONLoaderパラメーターです。これが、プロトコルのブリッジを妨げるものだと思います。この問題を解決するには、objcと互換性を持たせる必要があります。

3
Antonio

親クラスを持たないクラスMyConnectionがあったため、この問題に直面しました。このような。

public class MyConnection {
}

入れられない@objcこの前に、警告が表示されます

NSObjectから継承するクラスのみを@objcで宣言できます

そこで、クラスをNSObjectから継承するように変更しました。このような

public class MyConnection: NSObject {
}
8
Ramaraj T

同じエラーが発生しました。 method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C.

Swift 2.0で構文を次のように変更しました。これで正常に動作します!

@objc protocol AppModelDelegate {
    optional func compititorList(com:[Competitor]!)
}

class Competitor:NSObject{
    var id:Int?
    var title:String?
}

注:競合他社のクラスタイプがNSObjectに変更され、デリゲートルール違反がクリアされました

NSJSON解析の場合も同様です。以下に変更しました。

if (_httpStatusCode == 200) {
    let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
    var error : NSError?
    print("responseString : \(responseString) ")

    var service_result:NSDictionary =  NSDictionary()
    do {
        let anyObj = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as! [String:AnyObject]
        service_result = anyObj
    } catch let error as ErrorType {
        print("json error: \(error)")
    }
}
4
A.G
JSONLoaderError.LoadError

これは列挙型ですか? Swift列挙型をObj-Cコードに変換することはできません。代わりにintを使用する必要があります。

1
Sandy Chapman