2017-07-18 42 views
0

我需要为UITextView类增加一个额外的变量。如何扩展UITextView类?

我第一次尝试:

extension UITextView 
{ 
    var id : String 
} 

但它给出了一个错误消息Extension may not contain stored properties

第二次尝试:

extension UITextView 
{ 
    var id : String 
    { 
    get { return self.id } 
    set(newValue) { self.id = newValue } 
    } 
} 

但它击碎我的应用程序,并给出错误信息Thread 1 : EXC_BAD_ACCESS当我尝试在var id分配一个值。

enter image description here

我怎样才能在分配价值var id并打印?

回答

0

使用相关对象我解决了我的问题。

这是我的源代码(Swift3)。 。

import ObjectiveC 

var AssociatedObjectHandle: UInt8 = 0 

extension UITextView 
{ 
    var id : String 
    { 
     get 
     { 
      return objc_getAssociatedObject(self, &AssociatedObjectHandle) as! String 
     } 
     set 
     { 
      objc_setAssociatedObject(self, &AssociatedObjectHandle, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 

    } 
} 

感谢mag_zbcrmaddy您有用的答案!

1

所有我需要一个额外的变量加入的UITextView类

不能在扩展添加存储性能。唯一的方法是使用计算的属性和关联的对象,但这很丑。你应该写一个继承UITextView的类。

如果你确实不能继承UITextView,请看this回答如何使用带有计算属性的关联对象。

+0

我试过所谓的'丑陋'的方式,但它说'使用未解析的标识符OBJC_ASSOCIATION_COPY_NONATOMIC',这里有什么错? – Roy

+2

@Roy查看[在答案](https://stackoverflow.com/a/40862150/1226963)Swift 3。 – rmaddy

0

不,你不能这样做,因为属性需要存储和添加属性会改变类的内存结构以及在可用性中引入一系列其他问题。

扩展是为了增加行为,而不是从根本上改变一个类。所以,如果你需要添加额外的属性到一个类,你可以做到这一点使用子类,使用父类作为UITextView