Swift动态变量不能是Printable类型

时间:2014-10-14 22:55:00

标签: ios objective-c swift protocols key-value-observing

我有一个包含两个UITableViewControllers的Swift项目。第二个UITableViewController链接到名为Model的MVC模型。根据我在第一个UITableViewCell中选择的UITableViewController,我想要使用ModelInts初始化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'

有解决方法吗?

2 个答案:

答案 0 :(得分:0)

没有办法做你想做的事。非@objc协议无法在Objective-C中表示。一个原因是非@objc协议可以表示非类类型(实际上,您说您想将它用于IntString,这两种类都是非类型的, Objective-C中的协议和协议仅适用于对象。

KVO是为Objective-C设计的功能,因此您必须从Objective-C的角度思考您期望它看到的内容。如果你在Objective-C中这样做,你不希望有一个属性可能是id之类的对象,或者像int这样的非对象 - 你甚至不能声明。相反,正如您在评论中所说,您可能希望它只是对象。并且您希望能够使用Foundation的桥接将Int转换为NSNumber *,将String转换为NSString *。这些是继承自NSObject的常规Cocoa类,它实现Printable

所以在我看来你应该使用NSObjectNSObjectProtocol

答案 1 :(得分:-1)

不幸的是,ObjC不会将协议视为类型,它们只是分组成员的便捷方式。在封面下,它们是Any类型,所以遗憾的是你必须将属性设为Any并转换为Printable。

我能做的最好的事情是:

dynamic var selectedValue: Any
var printableValue : Printable {
  get {
    return (Printable)selectedValue
  }
  set {
    selectedValue = newValue
  }
}