9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

改めてObjective-C の言語を理解する(プロパティ編 その1)

Posted at

はじめに

私はObjective-c に出会う前まではJava、C#をメインに開発を行っていました。
そのため、プロパティは他の言語でも使用していたため特に違和感はありませんでした。
しかし、オプションという概念だけは他の言語と比べて重要であり避けては通れない知識であると感じたため、改めて理解を深める意味も含めて纏めたいと思います。

お願い

人に読んでもらえるような記載にはなっていない点や自己都合で省略している点もありますので、参考にされる方がいらっしゃいましたら、よく理解した上で再検証して頂ければと思います。

オプション(アクセサー名の指定: setter=)

  • getter=
  • setter=

このオプションは一度も使ったことがありません。
そのため念のため、検証してみました。
結果から先に書いておきます、以下のコードのままでは実行時エラーとなります。

// Person.h
# import <Foundation/Foundation.h>

@interface Person : NSObject

@property NSString *name1;
@property (setter=fullName:) NSString *name2;

@end
// ViewController.m
# import "ViewController.h"
# import "Person.h"

@interface ViewController ()

@end

@implementation ViewController

// ------ 一部省略 ------ //

# pragma mark -

// プロパティ実験(アクセサー名の指定)
- (IBAction)tapPropertiesTestByAccessorName:(id)sender {
    
    Person *person = [[Person alloc] init];

    // OK
    person.name1 = @"ネーム";

    // OKのはず
    [person fullName:@"フルネーム"];
}
@end

調査しました

元々の想像(指定した名前でビルド時にセッターが生成される)とは違い、
このオプションは明示的にアクセッサメソッドを指定出来るというものでした。

そのため、以下のコードを追加してあげることによって期待した動作になりました。
無限ループになるコードは日常では無意識で回避していたようで遭遇しませんでしたが、
今回はあえて試してみたところ想定通りの動作となりました。

// Person.m
# import "Person.h"

@implementation Person

-(void)fullName:(NSString*)value {
    //self.name2 = value;  : NG 無限ループします
    _name2 = value;
}

@end

ちなみに以下のようなコードを記載しても先ほど指定したセッター経由でデータが引き渡されるようになります。

person.name2 = @"フルネーム2";

備考

地味な検証ではありましたが、過去の経験則から考えるとこのような細かい調査の積み重ねは継続が大事なので不定期にはなると思いますが思いついた時に少しずつ書き溜めたいと思います。
またサンプルコードのままでは警告が表示されているので、少しずつ確認も含めて調査したいと思います。

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?