2015-03-03 4 views
9

Я пытаюсь создать протокол для загрузки загрузки JSON, JSONLoaderDelegate. Мой другой класс, называемый JSONLoader, предполагается направить события своего делегата (который реализует протокол JSONLoaderDelegate) как:Невозможно использовать собственный класс в протоколе с атрибутом @objc?

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

Реализация JSONLoader не так важно (имхо). Однако я, кажется, есть проблемы для реализации протокола, это код:

@objc protocol JSONLoaderDelegate { 

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

} 

Это выглядит довольно просто для меня, но я получаю сообщение об ошибке:

method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C.

указал на все три функции.

Очевидно, что если я удалю атрибут @objc, я не могу использовать функцию optional для этой функции. Я бы очень хотел сохранить jsonLoaderdidBeginLoading как необязательный tho. Любые идеи/способы решения этой проблемы? Спасибо!

ответ

3

Что общего у 3 метода есть параметр JSONLoader, и это то, что я думаю, не позволяет вам связывать протокол. Чтобы решить проблему, вы должны сделать ее совместимой с objc.

+0

Да, ваше предположение верно или, по крайней мере, так оно и есть. Однако, как сделать его совместимым с objc? Добавляю ли я «@objc» перед «class JSONLoader»? – Fygo

+0

Добавьте @objc к его объявлению ... и исправьте все необходимое, чтобы сделать его совместимым (например, нет дженериков). В конце концов, это может быть неправильный подход ... просто для того, чтобы иметь дополнительную функцию в протоколе. Это компромисс, и вам решать, какой из двух вариантов лучше (совместимость с objc или отсутствие дополнительной функции) – Antonio

+0

Да, я вижу, что я не могу сделать enum @objc совместимым. Думаю, я просто избавлюсь от этого необязательного. О, хорошо ... Спасибо за вашу помощь! – Fygo

1
JSONLoaderError.LoadError 

Является ли это перечислением типа? Вы не можете преобразовать переменные Swift в код Obj-C. Вместо этого вам нужно использовать int.

6

Я столкнулся с этой проблемой, поскольку у меня был класс MyConnection, у которого не было родительского класса. Нравится это.

public class MyConnection { 
} 

Я не могу поставить @objc перед этим, как я получаю предупреждение

Only classes that inherit from NSObject can be declared @objc

Так что я изменил класс наследоваться от NSObject.

public class MyConnection: NSObject { 
} 
1

У меня была такая же ошибка. 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)") 
    } 
} 
Смежные вопросы