这里有一个直观的描述来解释什么是“一维数据类型”:number或string被格式化为多种多样的值,可以通过数学运算或某种转换方法可以算出它们的值。比如:十六进制的颜色值 <tt style="box-sizing: border-box; color: rgb(238, 130, 98);">#EE8262</tt> 的红绿蓝三原色的值通过掩码或移位运算得出;正则表达式可以通过少量字符中复杂的样本中进行匹配。
在所有的一维数据类型中,URI 有着至高地位。单独就人类可阅读的字符串这一点来说,它存在并将永远存在于计算机中任何你能够想象到的对位置信息进行编码的数据中。
它最基础的表示法中,URI 由一个 scheme 和一个 hierarchical part 组成,带有 query 和 fragment(后两者非必需):
<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]
很多像HTTP的协议中会定义有一定的规范结构,例如:username、password、port, 以及hierarchical part 中的 path:
对网络编程的扎实理解植根于对于 URL 各个部分的完全的熟悉。作为软件开发工程师,这意味着在你的编程语言标准库中存在着对URI进行指挥功能的命令。
如果某门语言在标准库中没有 URL 模块,你要跑着离开这门语言(不能用走的!>一定要跑!),这不是一门真正的编程语言。
在 Foundation 库中,NSURL用来代表 URL。
NSURL 可以通过 URLWithString: 类方法实例化。
NSURL *url = [NSURL URLWithString:@"http://example.com"];
如果传入值不是合法URL,这个方法会返回一个 nil
值。
我们几周前提到过 NSString
也有一些关于path处理的残留功能,但这些功能对于处理 NSURL
实在是太麻烦了。把 NSString
转化为 NSURL
带来的额外转化成本让这件事并不那么方便,你总是要花时间在这个上面。如果一个值就是一个URL,那么它就应该被保存为 NSURL
,把这两种类型搞混是懒惰而鲁莽的API设计。
附加提示:@@ 是创建 NSURL 的字面量的绝佳方法(例如:@@"http://example.com"),怎么样,很方便吧?
NSURL 也有一个类方法 +URLWithString:relativeToURL: 可以根据一个 base URL 地址和关联字符串来构造 URL。这个方法的行为由于其对子目录的/符号的处理而变得非常混乱无序。
这里有一些这个方法用法的典型参考:
NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"];
[NSURL URLWithString:@"foo" relativeToURL:baseURL];
// http://example.com/v1/foo
[NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL];
// http://example.com/v1/foo?bar=baz
[NSURL URLWithString:@"/foo" relativeToURL:baseURL];
// http://example.com/foo
[NSURL URLWithString:@"foo/" relativeToURL:baseURL];
// http://example.com/v1/foo
[NSURL URLWithString:@"/foo/" relativeToURL:baseURL];
// http://example.com/foo/
[NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL];
// http://example2.com/