我想创建一个类似Convertible的协议并扩展NSObject子类来实现它.特别是:
protocol DataConvertible { class func convertFromData(data:NSData) -> Self? func data() -> NSData }
我认为实施将如此简单:
extension UIImage : DataConvertible { class func convertFromData(data:NSData) -> Self? { let image : UIImage? = UIImage(data: data) return image } func data() -> NSData { return UIImagePNGRepresentation(self) } }
但这无法编译错误’UIImage’与’Self’不同.我错过了什么吗?
有没有其他方法来实现这样的协议?
解决方法
免责声明:这是一种解决方法,而不是理想的解决方案.
在协议中使用typealias而不是Self工作:
protocol DataConvertible { typealias Result class func convertFromData(data:NSData) -> Result? func data() -> NSData }
然后返回UIImage?而不是自我?从convertFromData的实现:
extension UIImage : DataConvertible { class func convertFromData(data:NSData) -> UIImage? { let image : UIImage? = UIImage(data: data) return image } func data() -> NSData { return UIImagePNGRepresentation(self) } }
更新:虽然这并没有严格执行UIImage.convertFromData(数据)将返回UIImage?就某些情况而言,它确实可以通过其他泛型来强制执行(正如@hpique here所指出的那样).
例如:
class Cache<T: DataConvertible where T.Result == T> { /* ... */ }
然后,如果您尝试定义UIImage.convertFromData以返回Int?:
class func convertFromData(data:NSData) -> Int? { return 1 }
只有协议到位,它将编译.但是,如果您尝试创建Cache< UIImage>,它将失败,因为Int(T.Result)不等于UIImage(T).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。