如何扩展UITextView类?

时间:2017-07-18 13:56:08

标签: ios oop swift3 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中分配值并打印出来?

3 个答案:

答案 0 :(得分:1)

  

我只需要在UITextView类中添加一个额外的变量

您无法在扩展程序中添加存储的属性。唯一的方法是使用计算属性和相关对象,但这很难看。您应该编写一个继承UITextView的类。

如果您真的无法继承UITextView,请查看this如何使用具有计算属性的关联对象。

答案 1 :(得分:0)

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

扩展旨在增强行为,而不是从根本上改变一个类。因此,如果需要向类添加其他属性,可以使用使用父类为UITextView

的子类来实现

答案 2 :(得分: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_zbc rmaddy 提供有用的答案!