Swiftの??
- オプショナルの変数にデフォルト値を指定する
- ダブルオプショナルな変数を取り出す
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.
(プロトコルのオプション要件を定義できます。 これらの要件は、プロトコルに準拠するタイプで実装する必要はありません。 オプションの要件には、プロトコルの定義の一部としてオプションの修飾子が接頭辞として付けられます。)
他には、
UITableViewDataSource
のnumberOfRowsInSection
がoptionalなメソッドです。(TableViewにおいてセクション数は任意)
optional func numberOfSections(in tableView: UITableView) -> Int // Default is 1 if not implemented
ダブルオプショナルな変数は「そもそもこの変数自体が存在しない可能性もある」ため、
- 1つ目の ? : 変数が実装されているか
- 2つ目の ? : 変数の値が設定されているか
で、2回のアンラップが必要になり、「??」という記載になるようでした。
補足
純粋な Swift ( Pure Swift ) にはオプショナルなメソッドは宣言できないようですが、
使い方はコメント欄でご教授いただきましたのでご参照ください〜
Swift におけるオプショナルなメソッドについて真面目に考える – PSYENCE:MEDIA