加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

迅捷 – 与’自我’不一样

发布时间:2020-12-14 04:36:32 所属栏目:百科 来源:网络整理
导读:我想创建一个类似Convertible的协议并扩展NSObject子类来实现它.特别是: protocol DataConvertible { class func convertFromData(data:NSData) - Self? func data() - NSData} 我认为实施将如此简单: extension UIImage : DataConvertible { class func c
我想创建一个类似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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读