我可以通过使用它作为参数来检查可选项是否为nil?

时间:2017-05-09 09:51:08

标签: swift optional

我有一个带有可选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

3 个答案:

答案 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
}