我有一个包含两个UITableViewControllers
的Swift项目。第二个UITableViewController
链接到名为Model
的MVC模型。根据我在第一个UITableViewCell
中选择的UITableViewController
,我想要使用Model
或Ints
初始化Strings
的某些属性。因此,我决定使用Printable
协议类型定义这些属性。同时,我想在其中一个属性上执行Key Value Observing。
现在,Model
看起来像这样:
class Model: NSObject {
let title: String
let array: [Printable]
dynamic var selectedValue: Printable //error message
init(title: String, array: [Printable], selectedValue: Printable) {
self.title = title
self.array = array
self.selectedValue = selectedValue
}
}
此处的问题是selectedValue
声明行中出现以下错误消息:
属性不能标记为动态,因为它的类型不能 在Objective-C中表示
如果我转到Xcode Issue Navigator,我还可以阅读以下内容:
协议'可打印'不是'@objc'
有解决方法吗?
答案 0 :(得分:0)
没有办法做你想做的事。非@objc
协议无法在Objective-C中表示。一个原因是非@objc
协议可以表示非类类型(实际上,您说您想将它用于Int
和String
,这两种类都是非类型的, Objective-C中的协议和协议仅适用于对象。
KVO是为Objective-C设计的功能,因此您必须从Objective-C的角度思考您期望它看到的内容。如果你在Objective-C中这样做,你不希望有一个属性可能是id
之类的对象,或者像int
这样的非对象 - 你甚至不能声明。相反,正如您在评论中所说,您可能希望它只是对象。并且您希望能够使用Foundation的桥接将Int
转换为NSNumber *
,将String
转换为NSString *
。这些是继承自NSObject
的常规Cocoa类,它实现Printable
。
所以在我看来你应该使用NSObject
或NSObjectProtocol
。
答案 1 :(得分:-1)
不幸的是,ObjC不会将协议视为类型,它们只是分组成员的便捷方式。在封面下,它们是Any类型,所以遗憾的是你必须将属性设为Any并转换为Printable。
我能做的最好的事情是:
dynamic var selectedValue: Any
var printableValue : Printable {
get {
return (Printable)selectedValue
}
set {
selectedValue = newValue
}
}