Swift 3中的协议扩展 [英] Protocol extension in Swift 3

查看:134
本文介绍了Swift 3中的协议扩展的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要一个默认属性UIImageView,它将是isFlipped.我可以通过将UIImageView子类化并添加一个属性isFlipped来做到这一点. 但是我想为此使用用户协议和扩展名,但是一段时间后它崩溃了.下面是我的代码.如何正确使用它?谢谢

I want to have a default property of UIImageView, which would be isFlipped. I am able to do it by subclassing UIImageView and adding one property isFlipped. But I want to user protocol and extensions for this , but it is crashing after sometime. Below is my code. How can I use it in right way? Thanks

import Foundation
import UIKit

protocol FlipImage {
    var isFlipped: Bool { get set }
}

extension UIImageView:FlipImage{
    var isFlipped: Bool {
        get {
            return  self.isFlipped
        }
        set {
            self.isFlipped = newValue
        }
    }
}

推荐答案

正如Martin R所说,您不能通过类扩展将存储的属性添加到类中.但是您可以使用目标C关联对象通过扩展来实现

As Martin R said you can't add stored properties to a class through class extensions. But you can use the objective C associated objects to do it via an extension

private var key: Void?

extension UIImageView {
    public var isFlipped: Bool? {
        get {
            return objc_getAssociatedObject(self, &key) as? Bool
        }

        set {
            objc_setAssociatedObject(self,
                                     &key, newValue,
                                     .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

这篇关于Swift 3中的协议扩展的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆