@property (strong,nonatomic) UIVIEwController<UItableVIEwDelegate> *thing;
我想在Swift的这个Objective-C代码中实现一个属性.所以这里是我试过的:
class AClass<T: UIVIEwController where T: UItableVIEwDelegate>: UIVIEwController { var thing: T!}
这个编译.当我从故事板添加属性时,我的问题来了. @IBOutlet标签生成编译器错误.
class AClass<T: UIVIEwController where T: UItableVIEwDelegate>: UIVIEwController { @IBOutlet weak var anotherThing: UILabel! // error var thing: T!}
错误:
Variable in a generic class cannot be represented in Objective-C
我实施这个权利吗?我可以做些什么来修复或解决这个错误?
解决方法 我遇到了同样的问题,也尝试了通用的方法.最终,通用方法打破了整个设计.在重新考虑了这个问题之后,我发现一个不能用于完全指定一个类型的协议(换句话说,必须附加类型信息等类型)不太可能是一个完整的.此外,虽然声明Classtype< ProtocolType>的Objc风格方便,它忽略了由协议提供的抽象的好处,因为这样的协议并没有真正提高抽象级别.此外,如果这种声明出现在多个地方,必须重复.更糟糕的是,如果这种类型的多个声明是相互关联的(可能是一个单一的对象将在其周围传递),程序变得脆弱而难以维护,因为如果一个地方的声明需要更改,那么所有相关的声明必须也改变了.
解
如果属性的用例涉及协议(例如ProtocolX)和类的某些方面(例如ClassX),则可以考虑以下方法:
>声明一个附加协议,继承自ProtocolX,并附加了ClassX自动满足的方法/属性要求.像下面的例子一样,一个方法和一个属性是额外的要求,这两个都是UIVIEwController自动满足的.
protocol CustomtableVIEwDelegate: UItableVIEwDelegate { var navigationController: UINavigationController? { get } func performSegueWithIDentifIEr(IDentifIEr: String,sender: AnyObject?)}
>声明一个附加协议,并具有ClassX类型的附加只读属性.这种方法不仅可以全面使用ClassX,而且还具有不需要实现子类ClassX的灵活性.例如:
protocol CustomtableVIEwDelegate: UItableVIEwDelegate { var vIEwController: UIVIEwController { get }}// Implementation Aclass CustomVIEwController: UIVIEwController,UItableVIEwDelegate { var vIEwController: UIVIEwController { return self } ... // Other important implementation}// Implementation Bclass CustomClass: UItableVIEwDelegate { private var _aVIEwControllerRef: UIVIEwController // Could come from anywhere e.g. initializer var vIEwController: UIVIEwController { return _aVIEwControllerRef } ... // UItableVIEwDelegate methods implementation}
PS.上面的代码段仅供演示,不推荐将UIVIEwController和UItableVIEwDelegate混合在一起.
为Swift 2编辑:感谢@ Shaps的评论,可以添加以下内容以节省在任何地方实现所需的属性.
extension CustomtableVIEwDelegate where Self: UIVIEwController { var vIEwController: UIVIEwController { return self } }总结
以上是内存溢出为你收集整理的ios – 符合协议和类的Swift属性全部内容,希望文章能够帮你解决ios – 符合协议和类的Swift属性所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)