ぱっと検索できる範囲で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 } } }
書いてはみたものの、標準ライブラリにありそうな気がする。まだ探していない。