Help us understand the problem. What is going on with this article?

iOS10以降でも32bit端末を意識しなければならない時

More than 3 years have passed since last update.

はじめに

Intを使うことで、デバイスが64bitか32bitを意識することなくコードを書けるようになってはいたのですが、ハマった箇所があったのでまとめておこうと思います。
※現状で確認できているのは、NSPredicateのみで起こるクラッシュです。

iOS10をサポートしているデバイス

スクリーンショット 2016-10-04 13.36.09.png1

その中でも、iPhone5iPhone5ciPad 4thiPad mini 2は32bit端末になります。
最新のOSが32bit端末をサポートしているので、もしbit数まわりでクラッシュが起きる場合には考慮しなくてはならなくなると思います。

端末のbit数を意識しなければならない状況とは?

let id: Int
let fetchRequest: NSFetchRequest
fetchRequest.predicate = NSPredicate(format: "id = %lld", id)

この場合、IntInt64(long long int)であろうことを考慮して、%lldに指定するかと思います。
しかしながら、%lldでは32bit端末で実行時エラーとなってしまいます。
String(format:_:)ではクラッシュせずに値がおかしくなてしまうだけですが、NSPredicate(format:_:)ではクラッシュしてしまいます。

これを簡単に解決する方法は%lld%ldにすることかと思います。

下記のようにsizeofValue(id)sizeof(Int32)を比較して、%ldまたは%lldを出し分けるという方法もあります。

let id: Int
let fetchRequest: NSFetchRequest
//32bit端末対応
let key = sizeofValue(id) == sizeof(Int32) ? "%ld" : "%lld"
fetchRequest.predicate = NSPredicate(format: "id = \(key)", id)

ちなみにObjective-Cでは...

32bit端末で%lldを実行しても、値がおかしくなってしまうだけでクラッシュはしませんでした。

NSInteger id = 10; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id = %lld", id];
NSLog(@"%@", predicate);

最後に

Int32の最大値は2,147,483,647なので、そもそも最大値を越えた場合は32bit端末で正常な動作はしないのですが、32bitと64bitの端末はまだ存在しているということを頭の片隅に置いておくと、不要なクラッシュを防ぐことができるかもしれません。

2016/10/05追記

下記のコードでも対応可能でした。

let id: Int
let fetchRequest: NSFetchRequest
fetchRequest.predicate = NSPredicate(format: "id = %@", NSNumber(value: id))

分岐を書く必要がないので、NSNumberを使うとスッキリするかもしれません。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away