2015-10-22 103 views
1

是否有可能使用模式與三元如果運營商相匹配?如果運營商

請看下面的例子:

let someString: String? = ... 

if let embedURL = embedURL { 
    return NSURL(string: embedURL) 
} else { 
    return nil 
} 

這是冗長。我希望能夠做這樣的事情:

return let someString = someString ? NSURL(string: someString) : nil 

return case let .Some(someString) = someString ? NSURL(string: someString) : nil 

但是編譯器不接受。我知道我可以初始化器添加到NSURL它接受可選的字符串,正常使用if聲明甚至switch聲明,但我想知道是否有可能與三元if運營商做,或是否將有可能在一些點在未來。

回答

4

不能在三元條件運算符的條件使用模式匹配。 但是你可以用自選的flatMap()方法代替:

/// Returns `nil` if `self` is nil, `f(self!)` otherwise. 
public func flatMap<U>(@noescape f: (Wrapped) throws -> U?) rethrows -> U? 

你的情況:

let someString: String? = ... 
let url = someString.flatMap { NSURL(string: $0) } 

類型表達的是NSURL?,並且計算結果nil 如果someString == nil或者NSURL(string:)返回nil

由於@Cosyn注意到,最後一行也可以寫爲

let url = someString.flatMap(NSURL.init) 
+0

FYI的陷阱,你可以簡單的寫'讓URL = someString.flatMap (NSURL.init)' – Cosyn

+0

@Cosyn:你完全正確,謝謝! –

2

你並不需要使用模式匹配來實現這一目標。

return someString != nil ? NSURL(string: someString!) : nil 

就我所知,儘可能使用三元運算符。

+1

這種方法,用通風展開...... – Cristik