2015-11-20 4 views
1

У меня есть Objective класс C, который имеет методы, которые выглядят следующим образом:Реализация Objective C делегата Swift

@class Client; 

@protocol ClientDelegate <NSObject> 

@optional 
-(void) receivedMessageFromClient : (id) message; 

@end 

@interface Client : NSObject 

+(id) setup; 
@property(nonatomic, strong) id <ClientDelegate> clientDelegate; 

// more method declarations below 

Я реализации ClientDelegate в моем Swift класса, как это:

class HomeViewController: UIViewController, ClientDelegate { 
    var client : AnyObject? 
    var delegate: ClientDelegate? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     client = Client.setup() as! Client 
     client.clientDelegate = self 
    } 

func receivedMessageFromClient(message: AnyObject) { 
     print("Message recieved: \(message)") 
    } 
} 

Этот дает мне ошибку компилирования:

Cannot assign to property: 'self' is immutable

Когда я удалить строки

client = Client.setup() as! Client 
client.clientDelegate = self 

код компилируется и вызывает метод в классе Client, который в свою очередь посылает сообщение receivedMessageFromClient, но этот метод не вызывается в HomeViewController. Кажется, что все настроено, за исключением того, что я назначаю себя делегатом.

+0

Делегатов обычно имеет 'weak' атрибут вместо' strong'. И RTFM о протоколах https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html – Alexmelyon

+0

Возможный дубликат [Я использую классы объектного класса в swift2, как я могу реализовать методы делегирования и связать этот делегат] (http://stackoverflow.com/questions/33774912/i-am-using-objective-c-classes-in-swift2-how-i-can-implement-delegate-methods) –

+0

у вас есть мостовой заголовок? –

ответ

4

Проверьте мои комментарии на ваш вопрос, но это является основным примером Objective-C делегата, реализованным в Swift:

Objective-C:

@protocol MyDelegate <NSObject> 

@optional 
- (void)canImplementThis:(int)aVar; 
@required 
- (BOOL)needToImplementThis; 

@end 

@interface MyClass : NSObject 

@property (nonatomic, weak) id<MyDelegate> delegate; 

@end 

Swift:

class SwiftClass : UIViewController, MyDelegate { 

    var myObj : MyClass? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     myObj = MyClass() 
     myObj?.delegate = self 
    } 

    // MARK: - <MyDelegate> 

    func canImplementThis(aVar : Int) { 
     print("Called: \(aVar)) 
    } 

    func needToImplementThis() -> Bool { 
     return false 
    } 

} 

Простите опечатки я напечатал на это прямо в SO.

0

Если бы изменить Int к Int32 по какой-то причине, так что исправить неверный вопрос выбора, с Int32 на быстрой стороне, но затем работал

+1

Это не дает ответа на вопрос. Когда у вас будет достаточно [репутации] (https://stackoverflow.com/help/whats-reputation), вы сможете [прокомментировать любое сообщение] (https://stackoverflow.com/help/privileges/comment); вместо этого [предоставить ответы, которые не требуют разъяснений у аськи) (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- я-делать-вместо этого). - [Из обзора] (/ review/low-quality-posts/17897341) – mega6382