2015-10-22 71 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