5

我正在尝试在 swift 3 中构建一个 url,但我不明白为什么它没有正确地将字符串附加到 baseURL 输出不是我所期望的。在 swift 2 中它运行良好。

let token = "12token34"

let baseURL = URL(string: "https://api.mysite.net/map/\(token)/")

let desiredURL = URL(string: "37.8267,-122.4233", relativeTo: baseURL as URL?)

结果

37.8267,-122.4233 -- https://api.mysite.net/map/12token34/

我期待以下内容:

https://api.mysite.net/map/12token34/37.8267,-122.4233
4

2 回答 2

3

初始化器正在做你认为应该做的事情;URL这是令人困惑的字符串表示。在 REPL 中:

1> import Foundation
2> let token = "12token34"
token: String = "12token34"
3> let baseURL = URL(string: "https://api.mysite.net/map/\(token)/")
baseURL: URL? = "https://api.mysite.net/map/12token34/"

到目前为止,一切都很好; 现在是令人困惑的部分:

4> let desiredURL = URL(string: "37.8267,-122.4233", relativeTo: baseURL as URL?)
desiredURL: URL? = "37.8267,-122.4233 -- ttps://api.mysite.net/map/12token34/"

这是一个相对 URL 对象,但它确实代表了您期望的 URL:

5> desiredURL!.absoluteString
$R0: String = "https://api.mysite.net/map/12token34/37.8267,-122.4233"

如果你想要它以绝对形式,你可以得到它absoluteURL

6> desiredURL!.absoluteURL
$R1: URL = "https://api.mysite.net/map/12token34/37.8267,-122.4233"

请注意,这也适用于更多情况:

1> import Foundation
2> let base = URL(string: "http://example.org/foo/bar/baz.txt")
base: URL? = "http://example.org/foo/bar/baz.txt"

同一目录中的兄弟姐妹:

3> let sib = URL(string: "./qux.txt", relativeTo: base!)
sib: URL? = "./qux.txt -- ttp://example.org/foo/bar/baz.txt"
4> sib!.absoluteURL
$R0: URL = "http://example.org/foo/bar/qux.txt"

向上和向下的目录树:

5> let cousin = URL(string: "../corge/garply.txt", relativeTo: base!)
cousin: URL? = "../corge/garply.txt -- ttp://example.org/foo/bar/baz.txt"
6> cousin!.absoluteURL 
$R1: URL = "http://example.org/foo/corge/garply.txt"

一直到根并返回:

7> let fromRoot = URL(string: "/waldo/fred.txt", relativeTo: base!)
fromRoot: URL? = "/waldo/fred.txt -- ttp://example.org/foo/bar/baz.txt"
8> fromRoot!.absoluteURL
$R2: URL = "http://example.org/waldo/fred.txt"
于 2018-06-13T00:01:00.333 回答
1
let token = "12token34"
let baseURL = URL(string: "https://api.mysite.net/map/\(token)/")
let desiredURL = URL(string: "37.8267,-122.4233", relativeTo: baseURL as URL?)

这是错误的原因:

/// Initialize with string, relative to another URL.
///
/// Returns `nil` if a `URL` cannot be formed with the string (for example, if the string contains characters that are illegal in a URL, or is an empty string).
public init?(string: String, relativeTo url: URL?)

所以如果你想附加 url,输出应该是这样的:

let output = URL(string: baseURL!.absoluteString)
output?.appendingPathComponent("37.8267,-122.4233")

所以你可以直接使用:

baseURL!.appendingPathComponent("37.8267,-122.4233")
于 2016-11-15T08:16:26.543 回答