2017-07-18 12 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 } 
    } 
} 

しかし、それは私のアプリを押しつぶすと私はvar idに値を代入しようとすると、エラーメッセージThread 1 : EXC_BAD_ACCESSを与えます。

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 Swift 3の[回答時](https://stackoverflow.com/a/40862150/1226963)をご覧ください。 – rmaddy

0

プロパティを保存する必要があり、プロパティを追加すると、クラスのメモリ構造が変更されるだけでなく、ユーザビリティの問題が発生します。

エクステンションは、基本的にクラスを変更するのではなく、ビヘイビアを強化するためのものです。したがって、クラスにプロパティを追加する必要がある場合は、親クラスを使用するサブクラスを使用してサブクラスを使用することができます。UITextView

関連する問題