Avoid consecutive "if let" declarations in Swift -
in swift used if let
declarations check if object not nil
if allow obj = optionalobj { }
but sometimes, have face consecutive if let
declarations
if allow obj = optionalobj { if allow = obj.a { if allow b = a.b { // stuff } } }
i'm looking way avoid consecutive if let
declarations.
i seek :
if allow obj = optionalobj && if allow = obj.a && if allow b = a.b { // stuff }
but swift compiler not allow this.
any suggestion ?
i wrote little essay on alternatives time ago: https://gist.github.com/pyrtsa/77978129090f6114e9fb
one approach not yet mentioned in other answers, kinda like, add together bunch of overloaded every
functions:
func every<a, b>(a: a?, b: b?) -> (a, b)? { switch (a, b) { case allow (.some(a), .some(b)): homecoming .some((a, b)) default: homecoming .none } } func every<a, b, c>(a: a?, b: b?, c: c?) -> (a, b, c)? { switch (a, b, c) { case allow (.some(a), .some(b), .some(c)): homecoming .some((a, b, c)) default: homecoming .none } } // , on...
these can used in if let
statements, case
expressions, optional.map(...)
chains:
// 1. var foo: foo? if allow (name, phone) = every(parsedname, parsedphone) { foo = ... } // 2. switch every(parsedname, parsedphone) { case allow (name, phone): foo = ... default: foo = nil } // 3. foo = every(parsedname, parsedphone).map{name, phone in ...}
having add together overloads every
boilerplate'y has done in library once. similarly, applicative functor approach (i.e. using <^>
, <*>
operators), you'd need create curried functions somehow, causes bit of boilerplate somewhere too.
swift
No comments:
Post a Comment