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

Convert Signed Int to Unsigned Int

More than 5 years have passed since last update.

CoreLocation関連で結構困ったのでまとめておく。
といっても内容としては大した話ではない。

How to convert NSNumber to Uint16

let hoge: Int16 = 78
let num = NSNumber(short: hoge)
let uint_num = UInt16(bitPattern: num.shortValue)

結論だけ言うと、上記のようにすればNSNumberUInt16に変換できる。

背景

CLBeaconRegioninit()において、引数majorminorの型CLBeaconMajorValueCLBeaconMinorValue基底型はUInt16である。

CLBeaconRegion Initializer
init(proximityUUID proximityUUID: NSUUID,
major major: CLBeaconMajorValue,
minor minor: CLBeaconMinorValue,
identifier identifier: String)

しかし、CLBeaconRegionCLBeaconのメンバー変数majorminorを取り出してみると、その型はNSNumber?である。

Declaration
var major: NSNumber { get }

例えばlocationManager(_:didRangeBeacons:inRegion:)なんかで受け取ったinRegionからmajorminorなんかを取り出して、改めてCLBeaconRegionとしてなんかしようと思った時に、大変苦労した覚えがある。
castしようとしてみたり、辞書型を使って解決しようと試みたが失敗に終わり、上記のような変換に至った。

一般的な情報科学の常識に則って考えると、上記はとても簡潔でわかりやすい変換なのだが、そういうのをすぽーんと忘れて小手先だけで言語を扱うと痛い目に遭う。
そういうお話。

megane814
なんちゃって組み込みエンジニア。下回りの仕事ができる日を目指して頑張るっす。
Why not register and get more from Qiita?
  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