Swift中URLComponents的URL初始化器为何可失败?何时能确保非nil?
关于URLComponents.init?(url:resolvingAgainstBaseURL:)可失败设计的疑问解答
为什么这个初始化器被设计为可失败类型?
虽然URL(string:)返回的实例一定是合法URL,但并非所有合法URL都能被拆解为URLComponents支持的结构化组件。
URL的标准范畴里存在两类合法URL:分层URL(遵循scheme://host/path?query这类清晰结构)和不透明URL(无明确分层结构,仅由scheme和一段任意字符串组成)。URLComponents的核心作用是解析、操作URL的各个结构化组件(host、path、query等),但它只能处理符合RFC 3986标准的分层URL。如果传入的是不透明URL(比如部分自定义scheme的URL、某些特殊协议的URL),URLComponents无法将其拆解为对应的组件,因此初始化器会返回nil。
举个例子:tel:123456789是合法URL,但它属于不透明URL,没有host、path等分层结构,尝试用这个URL初始化URLComponents就会失败。
何种情况下能确保返回非nil值?
当传入的URL满足以下条件时,初始化器一定会返回非nil的URLComponents实例:
- 是符合RFC 3986标准的分层URL,具备清晰的scheme,以及可选的host、path、query等结构化组件
- 所有组件的格式都符合URL规范,没有包含URLComponents无法解析的异常结构
比如常见的http://example.com/api?param=value、https://github.com、file:///Users/username/Documents这类URL,都能被成功解析为URLComponents。
内容的提问来源于stack exchange,提问作者Mischa
相关产品推荐
相关产品推荐

