iOSアプリ開発の逆引き辞典

iPhone/iPadで使えるアプリ開発のTipsをまとめてみました

Swiftで乱数(ランダムな値)を生成する

特定の範囲の乱数を求める際には、Objective-Cと同じようにarc4random関数を使うことができます。

//0から9までの値を取得する
let random = arc4random() % 10

上記のコードではarc4random関数で得た乱数の余剰を求めているため、arc4random関数では生成される乱数にやや偏りが発生してしまいます。

事前に0から9までの値が欲しいということが分かっているのであれば、arc4random_uniform関数を使うと良いでしょう。

//0から9までの値を取得する
let random = arc4random_uniform(10)

例えば、String型の配列からランダムに1つ取り出す場合には以下のように書くことができます。

var titles: [String] = [ "ほげ", "ぽよ", "ぴよ", "ぷよ" ]
let index = (Int)(arc4random_uniform(4))
println("\(titles[index])")

Objective-Cで乱数を生成する場合は以下の記事を御覧ください。

ios.ch3cooh.jp

NSNumber型で現在の年度を取得する

過去にObjective-CでNSCalendarクラスとNSDateComponentsクラスを使って、以下のような現在の年度をNSNumber型で取得するメソッドがありました。このメソッドを

- (NSNumber*)yearNumber
{
    NSCalendar* gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDateComponents* comp = [gregorian components:NSYearCalendarUnit fromDate:[NSDate date]];
    return [NSNumber numberWithInteger:comp.year];
}

iOS 8 SDKを使ってビルドをすると、下記のようなワーニングが表示されるようになります。

example.m:164:74: 'NSGregorianCalendar' is deprecated: first deprecated in iOS 8.0 - Use NSCalendarIdentifierGregorian instead

example.m:163:49: 'NSYearCalendarUnit' is deprecated: first deprecated in iOS 8.0 - Use NSCalendarUnitYear instead

iOS 8.0以降、NSGregorianCalendarNSYearCalendarUnitの利用がdeprecated(非推奨)となりました。

iOS 7以前 iOS 8以降
NSGregorianCalendar NSCalendarIdentifierGregorian
NSYearCalendarUnit NSCalendarUnitYear

以下のように書き換えることが可能です。

- (NSNumber*)yearNumber
{
    NSCalendar* gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian] autorelease];
    NSDateComponents* comp = [gregorian components:NSCalendarUnitYear fromDate:[NSDate date]];
    return [NSNumber numberWithInteger:comp.year];
}

他にも名前が変わっている定義がいくつかあります。

iOS 7以前 iOS 8以降
NSGregorianCalendar NSCalendarIdentifierGregorian
NSYearCalendarUnit NSCalendarUnitYear
NSMonthCalendarUnit NSCalendarUnitMonth
NSDayCalendarUnit NSCalendarUnitDay
NSHourCalendarUnit NSCalendarUnitHour
NSMinuteCalendarUnit NSCalendarUnitMinute
NSWeekdayCalendarUnit NSCalendarUnitWeekday

文字列からUIImageオブジェクトを生成する

NSString型の文字列を画像に変換します。「サイズを指定して空のUIImageオブジェクトを生成する - iOSアプリ開発の逆引き辞典」をベースとしています。

- (UIImage *)imageWithString:(NSString *)text
{
    // 描画するサイズ
    CGSize size = CGSizeMake(34, 18);
    
    // ビットマップ形式のグラフィックスコンテキストの生成
    // 第2引数のopaqueを`NO`にすることで背景が透明になる
    UIGraphicsBeginImageContextWithOptions(size, NO, 0);
    
    
    // 描画する文字列の情報を指定する
    //--------------------------------------
    
    // 文字描画時に反映される影の指定
    NSShadow *shadow = [[NSShadow alloc] init];
    shadow.shadowOffset = CGSizeMake(0.f, -0.5f);
    shadow.shadowColor = [UIColor darkGrayColor];
    shadow.shadowBlurRadius = 0.f;
    
    // 文字描画に使用するフォントの指定
    UIFont *font = [UIFont boldSystemFontOfSize:14.0f];
    
    // パラグラフ関連の情報の指定
    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    style.alignment = NSTextAlignmentCenter;
    style.lineBreakMode = NSLineBreakByClipping;
    
    NSDictionary *attributes = @{
           NSFontAttributeName: font,
           NSParagraphStyleAttributeName: style,
           NSShadowAttributeName: shadow,
           NSForegroundColorAttributeName: [UIColor whiteColor],
           NSBackgroundColorAttributeName: [UIColor clearColor]
    };
    
    // 文字列を描画する
    [text drawInRect:CGRectMake(0, 0, size.width, size.height)
      withAttributes:attributes];
    
    // 現在のグラフィックスコンテキストの画像を取得する
    UIImage *image = nil;
    image = UIGraphicsGetImageFromCurrentImageContext();
    
    // 現在のグラフィックスコンテキストへの編集を終了
    // (スタックの先頭から削除する)
    UIGraphicsEndImageContext();

    return image;
}

使い方。

NSString *text = @"[ほ] ";
UIImage *image = [self imageWithString:text];