

タイトルの通り、実装しようと思い調べていましたら、Extensionではメソッドなどは追加できるが変数は追加できない、といった記事を見つけまして、自分でクラスを追加しなければならない、とのようなことが書いてありました。しかしイマイチ方法がわかりません。


CC BY-SA 3.0
2016-07-29T08:35:27.637
27942
2018-01-03T02:00:55.890
2017-11-11T11:46:52.500
76
10351
question
swift ios
UIViewのExtensionで変数を追加したい


単に「変数を追加したい」ではなく、その変数を用いて実現したいことを記述していただければ、よりその目的に沿った的確な回答があるかもしれません。

あなたが調べられた「自分でクラスを追加しなければならない」と言うのはサブクラス化のことを言っているのではないかと思います。

[code]

    class MyView: UIView {
        var myInt: Int = 0
        var myString: String? = nil
    }
    
[/code]

このように`UIView`を継承したクラスを作ってやれば(`MyView`なんて名前は実際のアプリではより適切な名前に置き換えてください)、`MyView`クラスのインスタンスは`UIView`の一種として使用できます。

ただ、`UIView`のサブクラス化にはいろいろ難しい部分もあり、かなりのベテラン開発者でも苦労することが多いです。最初に書いたように、特定の方法論にこだわらずに「本当は何がしたいのか」をご説明頂ければ、はるかに簡潔で優れた解法が見つかるかもしれません。


CC BY-SA 3.0
2016-07-29T20:01:29.973
27954
2016-07-29T23:09:28.803
2016-07-29T23:09:28.803
13972
13972
27942
answer


Associated Objectsを使って実現できます

[code]

    var hogeKey: UInt8 = 0
    
    extension UIView {
        var hoge: String? {
            get {
                guard let object = objc_getAssociatedObject(self, &hogeKey) as? String else {
                    return nil
                }
                return object
            }
            set {
                objc_setAssociatedObject(self, &hogeKey, newValue, .OBJC_ASSOCIATION_RETAIN)
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2017-11-11T11:19:22.520
39499
2017-11-11T11:19:22.520
427
27942
answer