Deca-pod.jp

Anything

if (somePerson != nil)って?

スカラ変数は宣言時に初期化するのがよい習慣です。そうでないと、スタック領域にたまたま残って
いた「ごみ」の値になってしまいます。

BOOL answer =NO;

int magicnumber = 10;

オブジェクトを指すポインタについては、これは必要ありません。初期値を指定しなければ、コンパ イラが自動的に、nilに初期化するからです。

XYZperson * person;
//personの値は自動的にnilになる


nil値は、特定の値を与えないオブジェクトの初期値として最も安全です。Objective-Cでは、nilに対 してメッセージを送信することは、まったく正当な処理だからです。nilにメッセージを送信しても、 当然ながら何も起こりません。
注意: nilにメッセージを送信してその戻り値を取得すると、その型がオブジェクトであれ ばnil、数値型であれば0、BOOL型であればNOとなります。

あるオブジェクトがnilでないこと(メモリ上のあるオブジェクトを指していること)を確認したい 場合、2つの方法があります。ひとつはCの非等価演算子を使う方法です。

if(person != nil){
//personはオブジェクトを指している

}

単にその変数を条件式として記述してしまうという方法もあります。

if(person){
//personはオブジェクトを指している

}

変数somePersonの値がnilであれば、条件式としての値は0(false)となります。アドレスであれば 0ではないので、条件式としての値はtrueになります。

APPLE公式ドキュメントobjective-cによるプログラミングより


条件式に変数が書いてあるのをみてそれってなんなのって思っていたけどよくわかりました。
こういったネタを重ねていけば良いプログラムが書けるようになるのかな。

@propertyで構造体を扱う方法

クラスTestを新しく作成して@interface部に
typedef struct{
	int a,b,c;
}character;
と宣言をして更に
@property character player;
を宣言しました。
他のクラスからTest *test= [Test new];をして
test.player.a = 10;とするとエラー
これは内部的にtest.playerという構文で[test setPlayer]というメソッドに置き換えられているから。
これを解決するためには新たにcharacter型の変数obbを宣言して
test.playerを代入。
obb.a = 10;とすることで目的は達成できる。

けど周りくどい。

typedef enumでproperty拡張


//.hファイルに

typedef enum{
	morning;
	afternoon;
	night;
	}env;
@properrty env dayCondition;

とすると

self.dayCondition = morning;

というようにアクセスすることができる。

このまま定数を使う予定のmファイルに#importしても定数を使えますが、

面倒なのとインポートの重複をさけたいので、

Supporting Filesフォルダのプロジェクト名-Prefix.pchファイル内に以下の様にConst.hを加えます。

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import "Const.h"
#endif


これで各ファイル毎インポート文を書かなくても定数を利用することができます。

objective-cでRPGの戦闘ダメージ計算

#import "ViewController.h"

@interface ViewController ()


@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    [self paramSet2:100 str:10 vit:10 playername:@"akira"];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction)lightButton:(id)sender {
    self.stageFlag = 0;
    [self enemyCreat];

    [self battle ];
}


- (IBAction)darkButton:(id)sender {
    self.stageFlag = 1;
    [self enemyCreat];
    [self battle];
}
-(int)strdef:(int)playerstr monsterVit:(int)monsterVit{//
    if (playerstr<monsterVit) {
        return 0;
    }else{
        return (playerstr - monsterVit);
    }
    
}
-(int)isDead:(int)hp{
    if (hp<1) {
        return 1;
    }else{
        return 0;
    }

}

-(void)attack:(int)playerStr monsterVit:(int)monsterVit{
    self.hp -=[self strdef:self.str2 monsterVit:self.vit];
}
-(void)attack2:(int)monsterStr playerVit:(int)playerVit{
    self.hp2 -=[self strdef:self.str monsterVit:self.vit2];
}

-(void)paramSet:(int)hp str:(int)str vit:(int)vit playername:(NSString*)name{//モンスターパラメータセット
    
    self.hp = hp;
    self.str = str;
    self.vit = vit;
    self.monstername = name;
    
    
    
}
-(void)paramSet2:(int)hp str:(int)str vit:(int)vit playername:(NSString*)name{//プレイヤーパラメータセット
    
    self.hp2 = hp;
    self.str2 = str;
    self.vit2 = vit;
    self.name = name;
    
    
    
}
-(void)enemyCreat{
    
    if (self.stageFlag ==0) {//光のダンジョンか闇のダンジョンか判定
        switch (arc4random()%2) {
            case 0:{
        [self paramSet:100 str:99 vit:7 playername:@"光ゴブリン"];
                NSString * stl =[NSString stringWithFormat:@"%@",self.monstername];
                int a = self.hp;
                int b = self.str;
                
                NSLog(@"%@が現れた!HP:%d str:%d:",stl,a,b);
            }
                break;
            case 1:{
        [self paramSet:80 str:8 vit:5 playername:@"光スケルトン"];
                NSString * stl =[NSString stringWithFormat:@"%@",self.monstername];
                int a = self.hp;
                int b = self.str;
                
                NSLog(@"セットしたよ%@:%d:%d:",stl,a,b);
            }
                break;
        }}else{
        
        

        switch (arc4random()%2) {
            case 0:
                [self paramSet:120 str:9 vit:5 playername:@"闇レイス"];
                break;
                case 1:
                [self paramSet:50 str:14 vit:9 playername:@"闇トロル"];
            default:
                break;
        }

        
        }
    
    
}
-(void)battle{
    NSLog(@"next battle");

    int deadHp = self.hp;
    int a = [self isDead:deadHp];
    int b = [self isDead:self.hp2];

    while (a == 0 || b ==0) {
        NSString * monsterName = [NSString stringWithFormat:@"%@",self.monstername];
        NSLog(@"君のHP:%d%@のHP:%dです",self.hp2,monsterName,self.hp);
        [self attack:self.str2 monsterVit:self.vit];
        [self attack2:self.str playerVit:self.vit2];
        if ([self isDead:self.hp] == 1) {
            NSLog(@"君の勝ち");
              [self paramSet2:100 str:10 vit:10 playername:@"akira"];
            break;
        }
        if ([self isDead:self.hp2]==1) {
            NSLog(@"君の負け");
              [self paramSet2:100 str:10 vit:10 playername:@"akira"];
            break;
        }
    }
  
    
}
@end

Viewcontrollerにcustomclassが設定できない!

iphoneアプリ作りを始めたらまずやるのがとりあえずViewcontrollerもう一個作って画面遷移をしてみよう!ってやつ。
元からあるのをViewcontroller新しく作った画面をViewcontrollerSubとしよう。

Viewcontrollerからcontrol押しながらViewcontrollerSubへ引っ張ってSegueを設定して画面遷移成功!

でもある時気付くんです。

ViewcontrollerSubはどのファイルでメソッドとか作ればいいの?って

ViewcontrollerはViewcontroller.hとViewcontroller.mが対応しています。

どうすればいいか

⌘+Nでクラスを新しく作ります。Viewcontrollerを継承する形でね。
名前はViewcontrollerSubとでもしておいてください。

そしてViewcontrollerSubをStoryBoradで選択してcustomclassに設定すればいいのですが
f:id:vaikong:20140711200103p:plain

なぜか新しく作ったクラスを設定出来ないよ!って人が居ます。
私です。

そんなときは確認してみてください。
Storyborad上で堂々とViewcontrollerの真ん中をクリックしてViewcontrollerを選択しているつもりになっているかもしれませんがあなたが選択しているのは

Viewです。

f:id:vaikong:20140711200442p:plain

冷静になってViewcontrollerの枠をクリックしてください。
f:id:vaikong:20140711200535p:plain

そしてcustomclassへの道は拓かれる!

疑問点は@vaikongまでどうぞ

View ControllerでScene is unreachable ..とエラーが出た時の解決方法。

Scene is unreachable due to lack of entry points and does not have an identifier for runtimeaccess via -instantiateViewControllerWithIdentifierScene is unreachable due to lack of entry points and does not have an identifier for runtimeaccess via -instantiateViewControllerWithIdentifier というエラーが出た時の解決方法。

View ControllerのStoryboard IDが設定されていないのが原因です。

StoryboardIDをチェックして空白だったら適当に文字入力して解決です。

f:id:vaikong:20140704191303p:plain