我有一个带有可选zoomURL属性@Injectable()
export class HttpClient extends Http {
constructor(backend: ConnectionBackend,
defaultOptions: RequestOptions) {
super(backend, defaultOptions);
}
get(url: string, options?: RequestOptionsArgs): Observable<any> {
return super.get(url, this.AddCustomOptions(options));
}
post(url: string, body: any, options?: RequestOptionsArgs): Observable<any> {
return super.post(url, body, this.AddCustomOptions(options));
}
put(url: string, body: any, options?: RequestOptionsArgs): Observable<any> {
return super.put(url, body, this.AddCustomOptions(options));
}
private AddCustomOptions(options: RequestOptionsArgs): RequestOptionsArgs {
if (options)
options.withCredentials = true;
else
options = new RequestOptions({
withCredentials: true
});
return options;
}
}
我一直在玩可选链接,试图缩短我所做的零检查量。我知道下面我可以轻松检查let zoomURL : String?
是否可以跳过这一步并立即将其用作函数中的参数并检查此函数是否为零?
例如:(失败)
let zoomURLString = meeting.zoomURL
答案 0 :(得分:3)
您可以使用
public func flatMap<U>(_ transform: (Wrapped) throws -> U?) rethrows -> U?
Optional
的方法:
if let parsedZoomURL = zoomURL.flatMap( { URL(string: $0) }) {
//do stuff
}
或更短(正如有人在现已删除的评论中注意到的):
if let parsedZoomURL = zoomURL.flatMap(URL.init) {
//do stuff
}
仅当zoomURL
不是nil
时,可选绑定才会成功
和闭包(然后使用展开的值调用它)
zoomURL
)不会返回nil
。
答案 1 :(得分:1)
如果您真的想要,可以为init
创建一个支持URL
值的nil
扩展名。如果字符串为nil
,则返回nil
。
extension URL {
init?(string: String?) {
guard let url = string else { return nil }
self.init(string: url)
}
}
用法:
if let url = URL(string: meeting.zoomUrl) {
// Do stuff
}
答案 2 :(得分:1)
Swift不会在方法调用上链接nil
,但它会让你使用与扩展属性相同的链接语法:
extension String {
var asURL : URL {
get {
return URL(string: self)!
}
}
}
现在你可以像往常一样使用链接:
if let parsedZoomURL = meeting.zoomURL?.asURL {
//do stuff
}