2017-07-18 39 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