LoginSignup
10
13

More than 3 years have passed since last update.

【Swift】2つの??について

Last updated at Posted at 2021-03-12

Swiftの??

  1. オプショナルの変数にデフォルト値を指定する
  2. ダブルオプショナルな変数を取り出す

Nil-Coalescing Operator

??演算子(Nil-Coalescing Operator)は、オプショナルの変数がnilだった場合の別の値を指定することが可能です。

var str: String?
print(str ?? "default value")
// 結果: default value
str = "hoge"
print(str ?? "default value")
// 結果: hoge

存在がオプショナルであるオプショナル変数

let window = UIApplication.shared.delegate?.window // UIWindow??という型で取り出せる

// ??での取り出し方
guard let frame = UIApplication.shared.delegate?.window??.frame { return }

アンラップする方法は他にもあります。(シンプルに2回アンラップする)
[Swift] ダブルオプショナルな変数をアンラップする方法 - YoheiM .NET

Double optionalとは?

window | Apple Developer Documentation より抜粋

public protocol UIWindowSceneDelegate : UISceneDelegate {
   optional var window: UIWindow? { get set }

var window: UIWindow? ではなく、optional var window: UIWindow?となっています。
先頭に optionalがついているのは、「プロパティもしくはメソッドの実装任意」ということを表しています。
Protocols — The Swift Programming Language (Swift5.4)のOptional Protocol Requirementsより

You can define optional requirements for protocols. These requirements don’t have to be implemented by types that conform to the protocol. Optional requirements are prefixed by the optional modifier as part of the protocol’s definition.
(プロトコルのオプション要件を定義できます。 これらの要件は、プロトコルに準拠するタイプで実装する必要はありません。 オプションの要件には、プロトコルの定義の一部としてオプションの修飾子が接頭辞として付けられます。)

他には、
UITableViewDataSourcenumberOfRowsInSection がoptionalなメソッドです。(TableViewにおいてセクション数は任意)

optional func numberOfSections(in tableView: UITableView) -> Int // Default is 1 if not implemented

ダブルオプショナルな変数は「そもそもこの変数自体が存在しない可能性もある」ため、

  • 1つ目の ? : 変数が実装されているか
  • 2つ目の ? : 変数の値が設定されているか

で、2回のアンラップが必要になり、「??」という記載になるようでした。

補足

純粋な Swift ( Pure Swift ) にはオプショナルなメソッドは宣言できないようですが、
使い方はコメント欄でご教授いただきましたのでご参照ください〜
Swift におけるオプショナルなメソッドについて真面目に考える – PSYENCE:MEDIA

10
13
3

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
10
13