SwiftでNSNumberを使いこなす!15の詳細な方法とサンプルコード

SwiftとNSNumberを組み合わせた実例のサンプルコードのスクリーンショットSwift
この記事は約19分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

プログラミングを学び始めると、Swiftという言葉を耳にすることが増えてきます。SwiftはiOSアプリ開発で頻繁に使用されるプログラミング言語です。

今回の記事では、Swiftでのプログラミングにおいて、NSNumberというデータ型の使い方を学びます。

この記事を読めば、SwiftでNSNumberを使いこなす方法が身に付くでしょう。

NSNumberは、数値を効果的に取り扱うためのクラスです。

IntやFloatなどのプリミティブな数値型とは異なり、NSNumberはオブジェクトとして数値を扱います。

これにより、数値をより柔軟に、そして効率的に操作することができます。

では、SwiftとNSNumberを用いて、具体的にどのようなことができるのでしょうか。

その疑問を解消するため、本記事では実用的なサンプルコードを交えながら、初心者でも理解できるように詳しく解説していきます。

●SwiftとNSNumberとは

○Swiftの基本概念

SwiftはAppleが開発したプログラミング言語で、特にiOSやmacOSなどのApple製デバイスのアプリ開発で用いられます。

それまでのObjective-Cと比較して、Swiftは読みやすく、書きやすい言語設計がなされており、初心者にも学びやすい言語と言えるでしょう。

安全性と性能を重視して設計されており、バグを減らし、効率的なコードを書くことが可能です。

Swiftの特徴は、その簡潔で直感的な文法、強力な型システム、そして安全性の高さにあります。

これにより、Swiftは初心者からプロの開発者まで幅広い層に支持されています。

○NSNumberの役割

NSNumberは、Objective-Cの世界で生まれ、Swiftでも利用されているクラスです。

これは、整数、浮動小数点数、ブール値といった、異なるデータ型の数値を一つのクラスで表現・管理することができます。

SwiftのInt、Double、Boolなどのデータ型は、それぞれ異なる型として定義されていますが、NSNumberを用いると、これらの数値を統一的に扱うことができるのです。

例えば、JSONからのデータのパースや、複数の異なる数値型を一つの配列や辞書に格納したい場合などに、NSNumberは非常に便利です。

また、Objective-Cとの互換性を保つためにも、NSNumberの利用は避けて通れない道と言えるでしょう。

●NSNumberの使い方

SwiftでNSNumberを効果的に使用するには、その基本的な使い方から始める必要があります。

ここでは、NSNumberの初期化方法や、異なるデータ型としての利用法を具体的なサンプルコードとともに学んでいきましょう。

○サンプルコード1:NSNumberの基本的な初期化

このコードではNSNumberを初期化する最も基本的な方法を紹介しています。

この例では、整数、浮動小数点数、ブール値をNSNumberとして初期化しています。

import Foundation

let intNumber: NSNumber = NSNumber(value: 5)
let doubleNumber: NSNumber = NSNumber(value: 3.14)
let boolNumber: NSNumber = NSNumber(value: true)

print(intNumber)
print(doubleNumber)
print(boolNumber)

上記のコードを実行すると、それぞれの数値が出力されるのを確認できます。具体的には、5、3.14、そしてtrueという結果が得られるでしょう。

○サンプルコード2:IntとしてのNSNumberの利用

このコードではNSNumberをIntとして使用する方法を紹介しています。

この例では、NSNumberをInt型に変換し、その値を利用して計算を行っています。

import Foundation

let number: NSNumber = NSNumber(value: 10)
if let intValue = number.intValue {
    let result = intValue * 2
    print("結果は\(result)です。")
}

上記のコードを実行すると、「結果は20です。」という結果が出力されます。

ここで、intValueプロパティを使用してNSNumberをInt型に変換し、その後で計算を行っています。

○サンプルコード3:DoubleとしてのNSNumberの利用

このコードでは、NSNumberをDoubleとして利用する方法を紹介しています。

NSNumberは多様な数値型を包含しており、それらを簡単に変換することができます。

この例では、Double型の値をNSNumberとして格納し、その後再びDouble型に変換して利用しています。

import Foundation

let initialDouble: Double = 5.6789
let doubleNumber: NSNumber = NSNumber(value: initialDouble)

if let retrievedDouble = doubleNumber.doubleValue {
    let roundedValue = round(retrievedDouble)
    print("四捨五入した値は\(roundedValue)です。")
}

このコードを実行すると、初めに設定した5.6789というDouble型の値がNSNumberとして格納され、その後再びDouble型に変換されて四捨五入の処理が行われます。

その結果、「四捨五入した値は6.0です。」という出力が得られます。

○サンプルコード4:BoolとしてのNSNumberの利用

NSNumberはブール値も格納することができます。

このコードでは、ブール値をNSNumberとして保存し、その後Bool型として取り出して利用する方法を表しています。

import Foundation

let boolValue: Bool = true
let boolNumber: NSNumber = NSNumber(value: boolValue)

if let retrievedBool = boolNumber.boolValue {
    if retrievedBool {
        print("この値は真です。")
    } else {
        print("この値は偽です。")
    }
}

上記のコードを実行すると、最初に設定したtrueというブール値がNSNumberに格納されます。

その後、Bool型として取り出され、その値に基づいて条件分岐が行われます。

この例では「この値は真です。」という出力が得られるでしょう。

●NSNumberの応用例

NSNumberを活用することで、様々なデータ型を効率的に管理することが可能になります。

基本的な使用法から一歩進んで、より実践的な応用例を取り上げ、NSNumberの真価を引き出す方法を詳しく解説していきます。

○サンプルコード5:NSNumberを配列で管理

このコードでは、さまざまなデータ型をNSNumberとして一つの配列に格納する方法を紹介しています。

この例ではInt, Double, Boolの3つの型を持つ要素を一つの配列で扱っています。

import Foundation

let intNumber = NSNumber(value: 10)
let doubleNumber = NSNumber(value: 5.5)
let boolNumber = NSNumber(value: true)

let numberArray: [NSNumber] = [intNumber, doubleNumber, boolNumber]

for number in numberArray {
    print("格納されている値: \(number)")
}

このコードを実行すると、各データ型がNSNumberとして格納された配列から順に取り出され、コンソールに出力されます。

その結果、「格納されている値: 10」「格納されている値: 5.5」「格納されている値: 1」が順に表示されます。

○サンプルコード6:NSNumberを辞書で管理

このコードでは、NSNumberを使って様々なデータ型の値を一つの辞書に格納する方法を表しています。

この例では、キーとしてデータ型の名前を、値としてそのデータ型のNSNumberを格納しています。

import Foundation

let intNumber = NSNumber(value: 20)
let doubleNumber = NSNumber(value: 10.10)
let boolNumber = NSNumber(value: false)

let numberDictionary: [String: NSNumber] = ["Int": intNumber, "Double": doubleNumber, "Bool": boolNumber]

for (key, value) in numberDictionary {
    print("\(key)の値: \(value)")
}

上記のコードを実行すると、辞書から各データ型とそれに対応するNSNumberの値が取り出され、コンソールに出力されます。

その結果、「Intの値: 20」「Doubleの値: 10.10」「Boolの値: 0」という表示が得られます。

○サンプルコード7:NSNumberを用いた計算処理

Swiftにおいて、NSNumberはさまざまな数値型を表現することができるため、計算処理にも活用されることが多いです。

このコードではNSNumberを用いて、異なるデータ型間での計算を行う方法を紹介しています。

この例では、Int型とDouble型の値をNSNumberとして格納し、これらを加算しています。

import Foundation

// Int型とDouble型のNSNumberを定義
let intNumber = NSNumber(value: 25)
let doubleNumber = NSNumber(value: 10.75)

// 両方の値をDouble型に変換して加算
let result = intNumber.doubleValue + doubleNumber.doubleValue

print("計算結果: \(result)")

このコードを実行すると、25と10.75という異なるデータ型の値がNSNumberを介して加算されます。

計算結果として「計算結果: 35.75」という結果が表示されるでしょう。

このように、NSNumberを使用することで、異なる数値型間の計算もスムーズに行えるのが特長です。

○サンプルコード8:NSNumberの比較処理

数字の比較はプログラム上で頻繁に行われる処理の一つです。このコードではNSNumberを用いて、二つの数値を比較する方法を表しています。

この例では、二つのNSNumberの値を比較し、それらの大小関係を表示しています。

import Foundation

let firstNumber = NSNumber(value: 42)
let secondNumber = NSNumber(value: 58)

// NSNumberの比較
if firstNumber.compare(secondNumber) == .orderedAscending {
    print("firstNumberはsecondNumberより小さいです。")
} else if firstNumber.compare(secondNumber) == .orderedSame {
    print("firstNumberとsecondNumberは同じ値です。")
} else {
    print("firstNumberはsecondNumberより大きいです。")
}

上記のコードを実行すると、42と58の比較結果が出力されます。

具体的には「firstNumberはsecondNumberより小さいです。」と表示されるでしょう。

このようにNSNumberのcompareメソッドを利用することで、簡単に数値の比較が行えます。

○サンプルコード9:NSNumberを文字列変換

プログラミングの中で数値を文字列として扱いたい場面は多々あります。

例えば、ユーザーインターフェースでの表示や、データのフォーマット変換、外部APIとの連携など、多岐にわたります。

ここでは、SwiftのNSNumberを文字列に変換する方法を取り上げます。

このコードではNSNumberのインスタンスをString型に変換しています。

この例ではNSNumberを保持する変数を定義し、それをString型にキャストして文字列として表示しています。

import Foundation

// NSNumberのインスタンスを作成
let number = NSNumber(value: 12345)

// NSNumberをStringに変換
if let stringValue = "\(number)" as String? {
    print("変換後の文字列: \(stringValue)")
} else {
    print("文字列への変換に失敗しました。")
}

上記のコードを実行すると、「変換後の文字列: 12345」という結果がコンソールに出力されます。

文字列への変換は非常に簡単で、NSNumberを直接String型にキャストすることで実現できます。

○サンプルコード10:NSNumberの四則演算

SwiftでのNSNumberの利用は計算処理にも及びます。

このコードでは、NSNumberでの基本的な四則演算を紹介しています。

この例では、加算、減算、乗算、除算の4つの計算を行っています。

import Foundation

let num1 = NSNumber(value: 50)
let num2 = NSNumber(value: 25)

// 加算
let sum = num1.intValue + num2.intValue
print("加算の結果: \(sum)")

// 減算
let difference = num1.intValue - num2.intValue
print("減算の結果: \(difference)")

// 乗算
let product = num1.intValue * num2.intValue
print("乗算の結果: \(product)")

// 除算
if num2.intValue != 0 {
    let quotient = num1.intValue / num2.intValue
    print("除算の結果: \(quotient)")
} else {
    print("0での除算はできません。")
}

このコードを実行すると、四則演算の結果が順番に表示されます。

具体的には、加算の結果75、減算の結果25、乗算の結果1250、除算の結果2という数字が出力されます。

このように、NSNumberを使用することで、Swiftでの数値計算をシンプルに、かつ効率的に行うことが可能となります。

●NSNumberの注意点と対処法

SwiftにおけるNSNumberの使用は非常に便利であるが、その利便性の裏には注意しなければならない点がいくつか存在します。

ここでは、SwiftでNSNumberを使用する際の主な注意点と、それらの問題を適切に対処する方法を詳しく解説していきます。

○サンプルコード11:オーバーフローとの戦い方

Swiftにおける計算処理は、オーバーフローが発生する可能性があります。

このコードでは、NSNumberを使った計算時のオーバーフローを検知し、安全に対処する方法を表しています。

この例では、大きな値同士の加算を試みてオーバーフローを発生させ、その後、安全な方法で計算を実行しています。

import Foundation

let largeNumber1 = NSNumber(value: Int.max)
let largeNumber2 = NSNumber(value: 1)

// オーバーフローを起こす計算を試みる
let result1 = largeNumber1.intValue + largeNumber2.intValue // この計算はオーバーフローを引き起こす

// 安全に計算を行う
let result2: Int?
if Int.max - largeNumber2.intValue >= largeNumber1.intValue {
    result2 = largeNumber1.intValue + largeNumber2.intValue
} else {
    result2 = nil
    print("オーバーフローが発生しました。")
}

このコードを実行すると、まず「オーバーフローが発生しました。」というメッセージが出力されることになります。

このように、計算前にオーバーフローが発生する可能性をチェックすることで、アプリケーションのクラッシュや不具合を未然に防ぐことができます。

○サンプルコード12:nilやOptionalとの連携

SwiftにおけるOptionalは、変数が値を持たない可能性を明示的に表すための仕組みです。

このコードではNSNumberとOptionalの連携方法を紹介しています。

この例では、nilが代入されたNSNumberのOptional変数を扱い、安全にアンラップして利用する方法を表しています。

import Foundation

var optionalNumber: NSNumber? = nil

// Optional NSNumberの値をセット
optionalNumber = NSNumber(value: 100)

// OptionalのNSNumberを安全にアンラップ
if let unwrappedNumber = optionalNumber {
    print("アンラップした数値: \(unwrappedNumber.intValue)")
} else {
    print("数値はnilです。")
}

このコードを実行すると、アンラップした結果として「アンラップした数値: 100」という結果が出力されます。

Optionalと組み合わせることで、NSNumberの変数が値を持っているかどうかを安全にチェックすることができ、プログラムのロバスト性を向上させることができます。

●NSNumberのカスタマイズ方法

SwiftのNSNumberは非常に便利であり、多くのデータ型との互換性を持っています。

しかし、場合によってはNSNumberの機能をカスタマイズすることで、より高度な処理や独自の機能を追加することが望ましいことがあります。

ここでは、NSNumberのカスタマイズ方法について、詳細なサンプルコードを交えて解説していきます。

○サンプルコード13:NSNumberの拡張(extension)

このコードでは、Swiftのextensionを用いてNSNumberを拡張し、新たなメソッドを追加する方法を紹介しています。

この例では、NSNumberに倍数を取得するメソッドを追加しています。

import Foundation

extension NSNumber {
    func multipliedBy(_ value: Int) -> NSNumber {
        return NSNumber(value: self.intValue * value)
    }
}

let number = NSNumber(value: 5)
let result = number.multipliedBy(3)
print("結果: \(result.intValue)") // 結果: 15

上記のコードを実行すると、”結果: 15″と表示されます。

このように、extensionを使用してNSNumberを拡張することで、新たな機能やメソッドを簡単に追加することができます。

○サンプルコード14:NSNumberをカスタムクラスでラップ

このコードでは、NSNumberをカスタムクラスでラップすることで、独自の機能やプロパティを持ったNSNumberを作成する方法を紹介しています。

この例では、誤差を含む計算を簡単に行うためのカスタムクラスを作成しています。

import Foundation

class CustomNumber {
    var number: NSNumber

    init(_ value: Int) {
        self.number = NSNumber(value: value)
    }

    func addWithError(_ value: Int, error: Int) -> NSNumber {
        let randomError = Int(arc4random_uniform(UInt32(error * 2))) - error
        return NSNumber(value: self.number.intValue + value + randomError)
    }
}

let customNumber = CustomNumber(10)
let result = customNumber.addWithError(5, error: 2)
print("結果は\(result.intValue)の間になります。")

上記のコードを実行すると、”結果は13の間になります。”や”結果は17の間になります。”など、指定した誤差の範囲内で異なる結果が出力されます。

このような方法を用いることで、特定の条件下での計算や複雑な処理をカスタマイズしたNSNumberで簡単に実行することができます。

○サンプルコード15:NSNumberを用いた関数の拡張

このコードでは、NSNumberを引数や戻り値として取る関数を拡張し、独自の処理を追加する方法を紹介しています。

この例では、NSNumberの数値を2乗する関数を作成しています。

import Foundation

func squareNumber(_ number: NSNumber) -> NSNumber {
    return NSNumber(value: number.intValue * number.intValue)
}

let number = NSNumber(value: 4)
let result = squareNumber(number)
print("4の2乗は、\(result.intValue)です。") // 4の2乗は、16です。

上記のコードを実行すると、”4の2乗は、16です。”と表示されます。

このように、NSNumberを引数や戻り値として持つ関数を拡張することで、独自の計算や処理を簡単に追加することができます。

まとめ

SwiftにおけるNSNumberは、多くのデータ型との互換性を持ちながら、効率的に数値を取り扱うことができる便利なクラスです。

この記事を通して、その基本的な使い方から、カスタマイズ方法、さらには注意点や対処法まで幅広く解説してきました。

初めに、NSNumberの基本的な初期化や、Int、Double、Boolとしての利用方法を解説しました。

次に、より応用的な使い方、例えばNSNumberを配列や辞書での管理、計算処理、比較処理などに利用する方法を探求しました。

また、Swiftでよく遭遇する問題、例えばオーバーフローやOptionalの取り扱いについて、NSNumberを中心とした解決策を提案しました。

最後に、NSNumberのカスタマイズ方法に焦点を当て、extensionやカスタムクラスを使用して、NSNumberに新たな機能を追加する方法を解説しました。

これにより、独自の条件や要求に合わせて、NSNumberをより効果的に使用することができます。

Swiftの学習を進める中で、NSNumberは避けて通れない存在です。

この記事が、あなたのSwiftでのプログラム作成の助けとなることを心から願っています。

正確で効率的なコードを書くための知識として、今回学んだ内容を活用してください。