LoginSignup
0
1

More than 5 years have passed since last update.

Swift Optionalの基本に関して

Last updated at Posted at 2017-12-01

SwiftとObjective-Cとの大きな差の一つは?

Optionalです。
Optionalを理解しましょう。

SwiftのOptionalとは

'nilを扱うことができるタイプ'と言う意味です。
逆に言うとOptionalではない一般変数(Variables)/常數(Constants)にはnilを入れ代入することは出来ないです。

これを利用すればSwiftの基本タイプ(Bool, Int, Floatなど)にもnilを使用できます。

Optionalの宣言

var optionalValue1: Bool? = nil
var optionalValue2: Optional<Int>
var optionalValue3: Int?
var optionalValue4: String!
var optionalValue5: [String: Any]?

**特に初期化宣言がない場合nilが基本的に代入される**

例)
var optionalValue: Int?
print(optionalValue)
optionalValue = 5
print(optionalValue)

result:
nil
optional(5)

Implicitly Unwrapped Optional

上の宣言を見るとoptionalValue4は'?'ではなく'!'で初期化された。
これをImplicitly Unwrapped Optionalと言う。nilで初期化されたのは同じだが少し差はある。
Screen Shot 2017-12-01 at 11.18.54.png

上のイメージのように!(暗視的Optional)で初期化された変数はコンパイラーからWarningが出ないのが確認できる。これは初期化視点では明確なデータが代入することはできないが以降使用されるときには必ず代入されるのを保証するとき使用する。もしnilが代入されたらランタイム中クラッシュするので注意が必要だ。

Optional使用

Optionalはnilが含まれる場合があると言うことでランタイム中nilかどうか確認する必要がある。

nil確認(if, guard)

var optionalValue: String?

if optionalValue != nil {
    print("optinalValueの値 = \(optionalValue)")
} else {
    print("optinalValueの値 = nil")
}

または

guard optionalValue != nil else {
    print("optinalValueの値 = nil")
    return
}

print("optinalValueの値 = \(optionalValue)")

Optional binding

if let nonOptionalStr = optionalValue {
    print(nonOptionalStr)
} else {
    print("nil")
}

Optional Chaining

var optionalValue1: String? = "efg"
var optionalValue2: String? = "123"

let str1 = optionalValue1?.uppercased()
let str2 = optionalValue2?.uppercased()
print(str1)
print(str2)

result:
Optional("EFG")
Optional("123")
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1