迅捷 – 与’自我’不一样

迅捷 – 与’自我’不一样,第1张

概述我想创建一个类似Convertible的协议并扩展NSObject子类来实现它.特别是: protocol DataConvertible { class func convertFromData(data:NSData) -> Self? func data() -> NSData} 我认为实施将如此简单: extension UIImage : DataConverti 我想创建一个类似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).

总结

以上是内存溢出为你收集整理的迅捷 – 与’自我’不一样全部内容,希望文章能够帮你解决迅捷 – 与’自我’不一样所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1005057.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存