21459


様々な型の変数が定義されたクラスにひたすらget/set関数を作っていたのですが、  
何かうまい方法はないのでしょうか。  
Any型を利用したら変数と対になるようなIDを渡してうまいことデータが取れないかなと考えたものの、  
いい方法が浮かびません。。。

有識者の皆さまは、このような場合、get/setメソッドを用意してアクセスしているものなのでしょうか？

[code]

    class A : NSObject {
    
        var deta1: Int
        var data2: String
        var classB = [B(), B(), B()] // クラスBのデータが3つ分ある
        var classC = C()
        …
        …
        var data50: Int
    
        func getdata1()->Int {
        }
        func getdata2()->String {
        }
        …
        …
    }
    
[/code]


CC BY-SA 3.0
2016-01-28T13:06:03.780
21451
2016-01-29T05:46:28.517
2016-01-29T00:29:38.260
12842
12842
question
swift
多数定義されたインスタンス変数へのアクセスについて


> 有識者の皆さまは、このような場合、get/setメソッドを用意してアクセスしているものなのでしょうか？

Swiftにおいては、生のインスタンス変数を直接定義したりアクセスしたりする手段は提供されておらず、全てがプロパティ(setterとgetterをドット記法でインスタンス変数っぽく見えるようにしたもの)です。

普通のSwiftプログラマーは特別な必要性が無い限り、get/setメソッド(getter/setter)をプロパティとは別に定義したりはしません。

[追記]題名にある「クラス変数」と言うのはオブジェクト指向言語では特別な意味合いを持ち、単に「クラス内で定義されている変数」と言う意味では使用しません。あなたのコード例の場合なら通常は「インスタンス変数」と言うべきところです。


CC BY-SA 3.0
2016-01-28T13:11:13.447
21452
2016-01-29T04:42:30.520
2016-01-29T04:42:30.520
5793
13972
21451
answer


[The Swift Programming Language (Swift 2.1) -
Properties](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254)

ここから、 **Instance Variable** （インスタンス変数）について述べられた箇所を引用します。

## Stored Properties and Instance Variables

> If you have experience with Objective-C, you may know that it provides  
>  two ways to store values and references as part of a class instance.  
>  In addition to properties, you can use instance variables as a backing  
>  store for the values stored in a property.
>
> Swift unifies these concepts into a single property declaration. A  
>  Swift property does not have a corresponding instance variable, and  
>  the backing store for a property is not accessed directly. This  
>  approach avoids confusion about how the value is accessed in different  
>  contexts and simplifies the property’s declaration into a single,  
>  definitive statement. All information about the property—including its  
>  name, type, and memory management characteristics—is defined in a  
>  single location as part of the type’s definition.

ちなみに、このAppleのドキュメントで、Instance Variableという語句が使われるのは、この項だけです。  
プロパティはインスタンス変数ではなく、プロパティを通してでなければ、インスタンス変数にアクセスできない。だから、Swiftはインスタンス変数を持たないということだと思います。端折りすぎてなにを言ってるのかわからなくなりましたが、ほかのオブジェクト指向言語におけるアクセッサメソッド（ゲッター、セッター）に該当するのが、Swiftではプロパティであるといっていいでしょう。ですから、プロパティにアクセッサメソッドを定義するのは、「過剰包装」といっていいかと思います。  
プロパティは、計算型プロパティ（ **Computed Properties** ）、プロパティオブザーバー（ **Property Observers**
）などの、アクセッサメソッドによく行われる実装のパターンを組みこんだしくみを持っています。プロパティに対して、アクセッサメソッドを実装する必要が出てきたとき、いちどアクセッサメソッドなしで実現できないか、お調べになる価値があると思います。


CC BY-SA 3.0
2016-01-29T03:58:16.190
21459
2016-01-29T03:58:16.190
7362
21451
answer


Swiftはよくわからないので一般論ですが。

インスタンス変数が多数ありそれを外部から触る(getter/setter経由も含む)というのはオブジェクト指向の原則に反しています。「どうやってアクセスすべきか」ではなく、「どうやって直接外部から触らなくても済むようにするか」を考えなければいけません。

改善方法の一例として、例えば、

  1. オブジェクトから変数の値を読み出す
  2. 取り出した値を加工する
  3. 結果を同じオブジェクトの別の変数に設定する

と言うコードがあるのであれば、これをメソッドとしてまとめることで、getter/setterが1つずつ不要になります。

リファクタリングの本を読んでみると典型的な例として紹介されているはずでどう改善すれば良いかもわかりますので、一読されることをお勧めします。


CC BY-SA 3.0
2016-01-29T05:46:28.517
21462
2016-01-29T05:46:28.517
5793
21451
answer