ぱっと検索できる範囲でinit?のサンプルを眺めていると、
初期化するメンバー変数が少なく、楽な感じなので不自由なさそうだったけれど、
メンバーが増えてくると煩わしさが倍々で増えていく気がして嫌だった。
例えば以下
class Test {
let member0: Int
let member1: Int
let member2: Int
let member3: Int
init?( arg0: Int?, arg1: Int?, arg2: Int?, arg3: Int? ) {
guard
let m0 = arg0,
let m1 = arg1,
let m2 = arg2,
let m3 = arg3
else { return nil }
member0 = m0
member1 = m1
member2 = m2
member3 = m3
}
}
そこで以下の様にしてみたところ、一対一にはなった。
好き嫌いは分かれると思う。
enum OptionalToExceptionError: Error {
case failure
}
public func fromOptional<T>(_ optionalTypeValue: T? ) throws -> T {
if let nonOptionalValue = optionalTypeValue {
return nonOptionalValue
} else {
throw OptionalToExceptionError.failure
}
}
class TestAlt {
let member0: Int
let member1: Int
let member2: Int
let member3: Int
init?( arg0: Int?, arg1: Int?, arg2: Int?, arg3: Int? ) {
do {
member0 = try fromOptional( arg0 )
member1 = try fromOptional( arg1 )
member2 = try fromOptional( arg2 )
member3 = try fromOptional( arg3 )
} catch _ {
return nil
}
}
}
書いてはみたものの、標準ライブラリにありそうな気がする。まだ探していない。