2015-03-31 84 views
6

我無法使swift類符合目標c協議。在swift中很容易在一個客觀的c協議中實現這些方法,但是我不能在下面的協議中實現這些屬性。使swift類符合定義屬性的目標c協議

的協議是

@protocol ATLParticipant <NSObject> 
@property (nonatomic, readonly) NSString *firstName; 
@property (nonatomic, readonly) NSString *lastName; 
@property (nonatomic, readonly) NSString *fullName; 
@property (nonatomic, readonly) NSString *participantIdentifier; 
@end 

我做了應該符合它這個迅速類,但Xcode中說,事實並非如此。

class ConversationParticipant: NSObject, ATLParticipant { 
    var firstName: NSString? 
    var lastName: NSString? 
    var fullName: NSString? 
    var participantIdentifier: NSString? 

    override init() { 
     super.init() 
    } 
} 

我試圖使成員變量可選(如上),及展開,並與私人(套)前綴,使他們只讀,但這些變化的工作。

回答

7

找到了解決方案,在Swift中你不應該使用NSString,而是String類型。

class ConversationParticipant: NSObject, ATLParticipant { 

    var firstName: String! 
    var lastName: String! 
    var fullName: String! 
    var participantIdentifier: String! 
    var avatarImage: UIImage! 

    override init() { 
     super.init() 
    } 
} 
+0

你知道如何爲其他委託性質和NSDictionaries,像這樣做: 屬性(強,非原子)id 委託; property(strong,nonatomic)NSDictionary * blogSocialNetworkUserNames; – Carlo 2015-06-07 05:56:48

1

我實現這個解決方案,仍然得到了一個錯誤:

「類型‘ConversationParticipant’不符合協議‘ATLAvatarItem’」

我增加了以下解決這個問題:

var avatarImageURL: NSURL! 
var avatarImage: UIImage! 
var avatarInitials: String! 

工作得很好。

0

對於ATLParticipant ...

class ConversationParticipant: ConversationAvatarItem, ATLParticipant { 

    var firstName: String! 
    var lastName: String! 
    var fullName: String! 
    var participantIdentifier: String! 

    override init() { 
     super.init() 
    } 
} 

對於ATLAvatarItem ...

class ConversationAvatarItem: NSObject, ATLAvatarItem { 

    var avatarImageURL: NSURL! 
    var avatarImage: UIImage! 
    var avatarInitials: String! 

    override init() { 
     super.init() 
    } 

} 
相關問題