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
をオプションとして残しておきたいと思います。これを解決するためのアイデア/方法はありますか?ありがとうございました!
3つの方法に共通しているのは、JSONLoader
パラメーターです。これが、プロトコルのブリッジを妨げるものだと思います。この問題を解決するには、objcと互換性を持たせる必要があります。
親クラスを持たないクラスMyConnection
があったため、この問題に直面しました。このような。
public class MyConnection {
}
入れられない@objc
この前に、警告が表示されます
NSObjectから継承するクラスのみを@objcで宣言できます
そこで、クラスをNSObject
から継承するように変更しました。このような
public class MyConnection: NSObject {
}
同じエラーが発生しました。 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)")
}
}
JSONLoaderError.LoadError
これは列挙型ですか? Swift列挙型をObj-Cコードに変換することはできません。代わりにintを使用する必要があります。