Swift 扩展属性不能作为实例属性使用

Swift 扩展属性不能作为实例属性使用,swift,protocols,swift-extensions,Swift,Protocols,Swift Extensions,我已经创建了UIImageView的协议扩展,并在扩展中添加了bool属性isFlipped。我的问题是,如果为一个对象设置isFlipped true或false,则为所有UIImageView对象设置相同的值。任何人都可以指导如何为每个UIImageView对象分别处理它 protocol FlipImage { var isFlipped: Bool { get set } } var flippedValue = false extension UIImageView:FlipIm

我已经创建了UIImageView的协议扩展,并在扩展中添加了bool属性isFlipped。我的问题是,如果为一个对象设置isFlipped true或false,则为所有UIImageView对象设置相同的值。任何人都可以指导如何为每个UIImageView对象分别处理它

protocol FlipImage {

var isFlipped: Bool { get set }

}
var flippedValue = false

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

如果您想使用扩展添加存储属性,下面是我使用的一个小技巧,它允许您对可以覆盖的基类(即视图控制器)执行此操作,我使用它是为了:

此协议允许使用扩展和协议中存储的属性扩展基类:

protocol ExtensibleObject:class
{
   var extendedProperties:[String:Any] { get set }
}

extension ExtensibleObject
{
   func get<T>(_ defaultValue:T, _ file:String = #file, _ line:Int = #line) -> T 
   {
      return (extendedProperties["\(file):\(line)"] as? T) ?? defaultValue
   }

   func set<T>(_ newValue:T, _ file:String = #file, _ line:Int = #line)
   {
      return extendedProperties["\(file):\(line)"] = newValue
   }
}
请注意,如果基类是您的,则可以直接在基类中执行

然后,您将为自己的子类使用可扩展基类,而不是基类:

class MyVC:ExtensibleViewController
{}
从那时起,任何子类都可以在扩展中接收新的存储属性:

extension MyVC
{
   var newStoredProperty:Int
   { get { return get(0) } set { set(newValue) } } // set and get must be on same line
}
还可以通过采用协议为实现ExtensibleObject协议的类添加存储属性:

protocol ListManager:ExtensibleObject
{
   var listContent:[String] { get set }
}

extension ListManager
{
   var listContent:[String]
   { get { return get([]) } set { set(newValue) } }
}

extension MyVC:ListManager {}

请记住,这些扩展属性表现为惰性变量,并且在使用时会有一些额外的开销。对于UI组件和视图控制器,这通常不是问题。

只有一个全局变量flippedValue.–解决方案正是你在回答上一个问题时提出的。但在我的上一个问题中,如何在扩展中创建属性,但这里我的问题是如何为每个对象处理它。因为如果我使用子类化,它将被视为每个对象的单独属性。我想用流行音乐,我不懂。不能在扩展中添加存储的属性。使用关联对象是解决该问题的一种变通方法。答案中给出的解决方案有什么不适用?谢谢Martin!但是通过子类化我们可以修复它,所以如果我必须在现有类中添加一些功能,比如UILabel、UIImageView,那么更好的方法是什么呢。
protocol ListManager:ExtensibleObject
{
   var listContent:[String] { get set }
}

extension ListManager
{
   var listContent:[String]
   { get { return get([]) } set { set(newValue) } }
}

extension MyVC:ListManager {}