Optional(Some<Int>) -> Int -> Optional<abs(Some<Int)> -> Int
... MEH
次のように汚いguard let ..., let ... else
修正を行うことができます(あなたが、その後すぐにアンラップとxAbs
に結合するオプションになるためにx
のバインドさ確か-not- nil
値を強制的に)
func foo() {
let arr: [Int] = [-1, 2, -3, 4]
guard let x = arr.first,
let xAbs = Optional(abs(xAbs)) else { return }
print(xAbs, xAbs.dynamicType)
}
foo() // 1 Int
しかしこれは非常にきれいに見えない、と私はCOVうとして、私は、個人的には、好むが、Int
拡張子を追加し、オプションのチェーンを利用するだろう次は
代わりに:あなたが明示的にx
などxAbs
を格納する必要がない限り、代替とよりSwiftyアプローチがInt
への簡単な拡張との組み合わせで、オプションのチェーンを使用することです
連鎖拡張機能やオプションを使用します。
arr.first
はオプション
Int
変数があるので
extension Int {
var absValue: Int { return abs(self) }
}
func foo() {
let arr: [Int] = [-1, 2, -3, 4]
guard let xAbs = arr.first?.absValue else { return }
print(xAbs, xAbs.dynamicType)
}
foo() // 1 Int
は、あなたがeとself
に望むものは何でも方法/計算プロパティを実装することができますxtensionをInt
に変更し、オプションのチェーンarr.first?.someMethod()
/(上記のように.absValue
として)を使用して、そのメソッド/プロパティにアクセスします。
それとも、単にguard let ... else
ブロック(技術的な議論を除く)しかし、私は理由を見ない
、x
の絶対値を保持する追加の不変を導入していない後にarr.first
(開封された)値を変更します。これによりコードの可読性も向上します。少なくともw.r.t.上記汚れたguard let ..., let ... else
に修正してください。
// ...
guard let x = arr.first else { return }
let xAbs = abs(x)
それとも、あなたはxAbs
プロパティは、理論的な観点のうち、可変であるために、それは許容あなたがではなくguard var ...
ブロックを使用することにより不変仲介人を削除することができ見つけた場合guard let ...
guard var xAbs = arr.first else { return }
xAbs = abs(xAbs)
xAbs
をもう一度突然変異させる場合にのみ使用してください(実際には変数を必要としない場合はいつでもimmutablesを使用してください)。
うーん、これは最善の答えかもしれません... Swiftはこの作業を行い、私が探していたものに正確に答えてくれるようです。あなたが 'flatMap {abs($ 0)}'だけではない理由は何ですか? – BallpointBen
@James absは素早い言語の一部ではありません...他の理由はありません。可能であれば、私は '純粋な'迅速なソリューションを好む – user3441734
ああ、あなたはそれを使用するために財団をインポートする必要がありますか?とにかくすべてのファイルについてそれをやっていると思いますので、それは大したことではありません。それぞれ自分自身に。 – BallpointBen