【问题标题】:Make swift class conform to objective c protocol that defines properties使 swift 类符合定义属性的目标 c 协议
【发布时间】:2015-06-04 12:42:11
【问题描述】:

我无法使 swift 类符合目标 c 协议。在一个objective c协议中很容易在swift中实现方法,但是我不能在下面的协议中实现属性。

协议是

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

我已经创建了这个应该符合它的 swift 类,但 Xcode 说它不符合。

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

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

我尝试将成员变量设为可选(如上),并展开并以 private(set) 为前缀以使它们成为只读,但这些变体均不起作用。

【问题讨论】:

    标签: ios objective-c swift


    【解决方案1】:

    找到了解决方案,在 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()
        }
    }
    

    【讨论】:

    • 你知道如何对其他委托属性和 NSDictionaries 执行此操作,例如:property (strong, nonatomic) id delegate;属性(强,非原子) NSDictionary *blogSocialNetworkUserNames;
    【解决方案2】:

    我实现了这个解决方案,但仍然报错:

    “类型‘ConversationParticipant’不符合协议‘ATLAvatarItem’”

    我添加了以下内容来解决它:

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

    并且工作得很好。

    【讨论】:

      【解决方案3】:

      对于 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()
         }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多