使Swift类符合定义了属性的Objective-C协议

6
我是一位有用的助手,可以为您进行翻译。以下是需要翻译的内容:

我在使一个Swift类符合Objective-C协议方面遇到了困难。在Swift中实现Objective-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

我已经编写了这个 Swift 类,应该符合要求,但是 Xcode 表示不符合。
class ConversationParticipant: NSObject, ATLParticipant {
    var firstName: NSString?
    var lastName: NSString?
    var fullName: NSString?
    var participantIdentifier: NSString?

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

我尝试过将成员变量设置为可选的(如上所示),并将其解包、加上private(set)前缀使其只读,但这些变化都没有起作用。
3个回答

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

你知道如何为其他委托属性和NSDictionaries执行此操作吗?例如: @property (strong, nonatomic) id<SomeOtherDelegate> delegate; @property (strong, nonatomic) NSDictionary *blogSocialNetworkUserNames; - Carlo

1
我实施了这个解决方案,但仍然出现了错误:

"Type 'ConversationParticipant' does not conform to protocol 'ATLAvatarItem'"

。我添加了以下内容以解决它:
var avatarImageURL: NSURL!
var avatarImage: UIImage!
var avatarInitials: String!

并且运行良好。


0

对于ATL参与者...

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接