From 64e6050b9157fa7c82756a463939d462b2a59d71 Mon Sep 17 00:00:00 2001 From: overtrue Date: Sat, 17 Oct 2015 14:34:24 +0800 Subject: [PATCH] Remove the extra label `p` & Emoji charactors. 1. Remote HTML tag `p` 2. Convert indentaion from Tabs to Spaces. 3. Emoji fix. --- source/chapter1/03_revision_history.md | 733 ++++++++++--------- source/chapter2/03_Strings_and_Characters.md | 58 +- 2 files changed, 396 insertions(+), 395 deletions(-) diff --git a/source/chapter1/03_revision_history.md b/source/chapter1/03_revision_history.md index c900048f..c734c5a4 100644 --- a/source/chapter1/03_revision_history.md +++ b/source/chapter1/03_revision_history.md @@ -2,7 +2,7 @@ --- -> 翻译:[成都老码团队翻译组-Arya](http://weibo.com/littlekok/) +> 翻译:[成都老码团队翻译组-Arya](http://weibo.com/littlekok/) > 校对:[成都老码团队翻译组-Oberyn](http://weibo.com/u/5241713117) 本页内容包括: @@ -35,20 +35,20 @@ - - + + - - + + + +
发布日期
发布日期 语法变更记录
2015-04-13
2015-04-13
    -
  • - XCode6.4包含了对于构建和调试基于iOS8.4 App的支持 +
  • + XCode6.4包含了对于构建和调试基于iOS8.4 App的支持
  • -
-
@@ -59,60 +59,60 @@ - - + + - - + + + +
  • + @autoclosure现在是一个参数声明的属性,而不是参数类型的属性。这里还有一个新的参数声明属性@noescape。更多信息,请看属性声明 +
  • +
  • + 对于类型属性和方法现在可以使用static关键字作为声明描述符,更多信息,请看类型变量属性 +
  • +
  • + Swift现在包含一个as?as!的向下可失败类型转换运算符。更多信息,请看协议遵循性检查 +
  • +
  • + 增加了一个新的指导章节,它是关于字符串索引的 +
  • +
  • + 从溢出运算符中移除了溢出除运算符和求余溢出运算符 +
  • +
  • + 更新了常量和常量属性在声明和构造时的规则,更多信息,请看常量声明 +
  • +
  • + 更新了字符串字面量中Unicode标量集的定义,请看字符串字面量中的特殊字符 +
  • +
  • + 更新了区间运算符章节来提示当半开区间运算符含有相同的起止索引时,其区间为空。 +
  • +
  • + 更新了闭包引用类型章节来澄清对于变量的捕获规则 +
  • +
  • + 更新了值溢出章节来澄清有符号整数和无符号整数的溢出行为 +
  • +
  • + 更新了协议声明章节来澄清协议声明时的作用域和成员 +
  • +
  • + 更新了捕获列表章节来澄清对于闭包捕获列表中的弱引用和无主引用的使用语法。 +
  • +
  • + 更新了运算符章节来明确指明一些例子来说明自定义运算符所支持的特性,如数学运算符,各种符号,Unicode符号块等 +
  • + +
    发布日期
    发布日期 语法变更记录
    2015-4-8
    2015-4-8
      -
    • - Swift现在自身提供了一个Set集合类型,更多信息请看集合 +
    • + Swift现在自身提供了一个Set集合类型,更多信息请看集合 -
    • -
    • - @autoclosure现在是一个参数声明的属性,而不是参数类型的属性。这里还有一个新的参数声明属性@noescape。更多信息,请看属性声明 -
    • -
    • - 对于类型属性和方法现在可以使用static关键字作为声明描述符,更多信息,请看类型变量属性 -
    • -
    • - Swift现在包含一个as?as!的向下可失败类型转换运算符。更多信息,请看协议遵循性检查 -
    • -
    • - 增加了一个新的指导章节,它是关于字符串索引的 -
    • -
    • - 从溢出运算符中移除了溢出除运算符和求余溢出运算符 -
    • -
    • - 更新了常量和常量属性在声明和构造时的规则,更多信息,请看常量声明 -
    • -
    • - 更新了字符串字面量中Unicode标量集的定义,请看字符串字面量中的特殊字符 -
    • -
    • - 更新了区间运算符章节来提示当半开区间运算符含有相同的起止索引时,其区间为空。 -
    • -
    • - 更新了闭包引用类型章节来澄清对于变量的捕获规则 -
    • -
    • - 更新了值溢出章节来澄清有符号整数和无符号整数的溢出行为 -
    • -
    • - 更新了协议声明章节来澄清协议声明时的作用域和成员 -
    • -
    • - 更新了捕获列表章节来澄清对于闭包捕获列表中的弱引用和无主引用的使用语法。 -
    • -
    • - 更新了运算符章节来明确指明一些例子来说明自定义运算符所支持的特性,如数学运算符,各种符号,Unicode符号块等 -
    • -
    -
    @@ -124,35 +124,35 @@ - - + + - - + + +
  • + 在运行时可能会失败的类型转换可以使用as?as!运算符,而确保不会失败的类型转换现在使用as运算符。更多信息,请看类型转换运算符 +
  • + +
    发布日期
    发布日期 语法变更记录
    2015-02-09
    2015-02-09
      -
    • - 在函数作用域中的常量声明时可以不被初始化,它必须在第一次使用前被赋值。更多的信息,请看常量声明 +
    • + 在函数作用域中的常量声明时可以不被初始化,它必须在第一次使用前被赋值。更多的信息,请看常量声明
    • -
    • - 在构造器中,常量属性有且仅能被赋值一次。更多信息,请看在构造过程中给常量属性赋值 +
    • + 在构造器中,常量属性有且仅能被赋值一次。更多信息,请看在构造过程中给常量属性赋值
    • -
    • - 多个可选绑定现在可以在if语句后面以逗号分隔的赋值列表的方式出现,更多信息,请看可选绑定 +
    • + 多个可选绑定现在可以在if语句后面以逗号分隔的赋值列表的方式出现,更多信息,请看可选绑定
    • -
    • - 一个可选链表达式必须出现在后缀表达式中 -
    • -
    • - 协议类型转换不再局限于@obj修饰的协议了 +
    • + 一个可选链表达式必须出现在后缀表达式中
    • -
    • - 在运行时可能会失败的类型转换可以使用as?as!运算符,而确保不会失败的类型转换现在使用as运算符。更多信息,请看类型转换运算符 +
    • + 协议类型转换不再局限于@obj修饰的协议了
    • -
    -
    @@ -164,29 +164,30 @@ - - + + - - - + + +
    发布日期
    发布日期 语法变更记录
    2014-12-19
      -
    • - 在对Watch App做消息通知模拟调试时,第一个payload.apns文件将会被默认选择 -
    • -
    • - 在为Watch App使用asset catalog时,38mm和42mm尺寸的图片就会被使用 -
    • -
    • - 在做Watch App开发时,@IBAction属性支持WKInterfaceSwitchWKInterfaceSlider Swift类型了 -
    • -
    • - 现在可以通过Device窗口安装,删除和访问App容器中的数据了。 -
    • -
    -
    2014-12-19 +
      +
    • + 在对Watch App做消息通知模拟调试时,第一个payload.apns文件将会被默认选择 +
    • +
    • + 在为Watch App使用asset catalog时,38mm和42mm尺寸的图片就会被使用 +
    • +
    • + 在做Watch App开发时,@IBAction属性支持WKInterfaceSwitchWKInterfaceSlider Swift类型了 +
    • +
    • + 现在可以通过Device窗口安装,删除和访问App容器中的数据了。 +
    • +
    +
    @@ -198,20 +199,20 @@ - - + + - - + + + +
    发布日期
    发布日期 语法变更记录
    2014-12-10
    2014-12-10
      -
    • - 现在在Interface Builder中可以针对特定的Device设备自定义Watch应用的Layout布局了 +
    • + 现在在Interface Builder中可以针对特定的Device设备自定义Watch应用的Layout布局了
    • -
    -
    @@ -223,30 +224,30 @@ - - + + - - + + +
  • + 在工具集中增加了对WatchKit的支持: + 1)UI设计工具增加了Apple Watch应用的界面组件,通知和小部件。 + 2)增加了调试和性能统计功能 + 3)增加Apple Watch应用的模拟器帮助调试应用功能 +
  • +
  • + 为了使Apple Watch应用能够正常工作,一些具体的参数必须设置: + 1)WatchKit中扩展配置文件Info.plist中的NSExtensionAttributes配置项WKAppBundleIdentifier必须和WatchKit App中的通用配置文件中的属性CFBundleIdentifier项目保持一致。2)WatchKit中的CFBundleIdentifier配置项必须和WKCompanionAppBundleIdentifier中的配置项保持一致 +
  • + +
    发布日期
    发布日期 语法变更记录
    2014-11-28
    2014-11-28
      -
    • - XCode6.2包含了iOS8.2 SDK,该SDK中包含WatchKit用来开发Apple Watch应用。 +
    • + XCode6.2包含了iOS8.2 SDK,该SDK中包含WatchKit用来开发Apple Watch应用。
    • -
    • - 在工具集中增加了对WatchKit的支持: - 1)UI设计工具增加了Apple Watch应用的界面组件,通知和小部件。 - 2)增加了调试和性能统计功能 - 3)增加Apple Watch应用的模拟器帮助调试应用功能 -
    • -
    • - 为了使Apple Watch应用能够正常工作,一些具体的参数必须设置: - 1)WatchKit中扩展配置文件Info.plist中的NSExtensionAttributes配置项WKAppBundleIdentifier必须和WatchKit App中的通用配置文件中的属性CFBundleIdentifier项目保持一致。2)WatchKit中的CFBundleIdentifier配置项必须和WKCompanionAppBundleIdentifier中的配置项保持一致 -
    • -
    -
    @@ -258,29 +259,29 @@ - - + + - - + + +
  • + 把纯正的Swift类对象实例赋值给AnyObject量不会再Crash了。 +
  • +
  • + 在泛型使用场景下,遵循了协议类要求的构造器方法或者类型方法可以直接调用继承类中的方法了。 +
  • +
  • + 修正了InterfaceBuild中如果图片名字含有“/”时,会在OSX10.10上Crash或者无法打开的问题 +
  • + +
    发布日期
    发布日期 语法变更记录
    2014-12-2
    2014-12-2
      -
    • - 在SourceKit中一些导致Crash的常见问题被修复,比如名字冲突和遗留废弃数据的问题等。 +
    • + 在SourceKit中一些导致Crash的常见问题被修复,比如名字冲突和遗留废弃数据的问题等。
    • -
    • - 把纯正的Swift类对象实例赋值给AnyObject量不会再Crash了。 -
    • -
    • - 在泛型使用场景下,遵循了协议类要求的构造器方法或者类型方法可以直接调用继承类中的方法了。 -
    • -
    • - 修正了InterfaceBuild中如果图片名字含有“/”时,会在OSX10.10上Crash或者无法打开的问题 -
    • -
    -
    @@ -292,26 +293,26 @@ - - + + - - + + + +
    发布日期
    发布日期 语法变更记录
    2014-10-16
    2014-10-16 -
    @@ -323,20 +324,20 @@ - - + + - - + + + +
    发布日期
    发布日期 语法变更记录
    2014-09-15
    2014-09-15 -
    @@ -348,23 +349,23 @@ - - + + - - + + +
  • + 自定义运算符现在可以包含`?`字符,更新的运算符(Operators)章节描述了改进后的规则,并且从自定义运算符(Custom Operators)章节删除了重复的运算符有效字符集合 +
  • + +
    发布日期
    发布日期 语法变更记录
    2014-09-09
    2014-09-09 -
    @@ -376,32 +377,32 @@ - - + + - - + + +
  • + 对于泛型的类库函数或接口统一从T!更换为T?T,这样使得语法更加严谨,明确了可能返回为空和不为空的情况 +
  • +
  • + 字符类型不能使用+运算法链接,可以以String(C1)+String(2) 的方式实现字符间链接 +
  • +
  • + 重写了Sort函数,解决了栈溢出的问题 +
  • + +
    发布日期
    发布日期 语法变更记录
    2014-09-03
    2014-09-03
      -
    • - 实现了内部库的修改和适配,主要包括如下: - 1)大量内部类或者函数遵循Optional类型和协议 - 2)移除大部分函数返回类型隐式解封可选类型的使用 +
    • + 实现了内部库的修改和适配,主要包括如下: + 1)大量内部类或者函数遵循Optional类型和协议 + 2)移除大部分函数返回类型隐式解封可选类型的使用
    • -
    • - 对于泛型的类库函数或接口统一从T!更换为T?T,这样使得语法更加严谨,明确了可能返回为空和不为空的情况 -
    • -
    • - 字符类型不能使用+运算法链接,可以以String(C1)+String(2) 的方式实现字符间链接 -
    • -
    • - 重写了Sort函数,解决了栈溢出的问题 -
    • -
    -
    @@ -411,32 +412,32 @@ - - + + - - + + +
  • + 在章节协议中,增加新的小节:对构造器的规定(Initializer Requirements) +
  • +
  • + 在章节协议中,增加新的小节:类专属协议(class-only protocols) +
  • +
  • + 断言(assertions)现在可以使用字符串内插语法,并删除了文档中有冲突的注释 +
  • +
  • + 更新了连接字符串和字符(Concatenating Strings and Characters)小节来说明一个事实,那就是字符串和字符不能再用+号运算符或者复合加法运算符+=相互连接,这两种运算符现在只能用于字符串之间相连。请使用String类型的append方法在一个字符串的尾部增加单个字符 +
  • +
  • + 在声明特性(Declaration Attributes)章节增加了关于availability特性的一些信息 +
  • + +
    发布日期
    发布日期 语法变更记录
    2014-08-18
    2014-08-18 -
    @@ -446,71 +447,71 @@ - - + + - - + + + +
  • + 在章节可选链中,增加一个新的小节 访问可选类型的下标脚注(Accessing Subscripts of Optional Type) +
  • +
  • + 更新章节 访问和修改数组(Accessing and Modifying an Array) 以标示:从该版本起,不能再通过+= 运算符给一个数组添加一个新的项。. 对应的替代方案是, 使append 方法, 或者通过+=运算符来添加一个只有一个项的数组(single-item Array).
  • +
  • + 添加了一个提示:在 范围运算符(Range Operators)中,比如, a...ba..<b ,起始值a不能大于结束值b. +
  • +
  • + 重写了继承(Inheritance) 这一章:删除了本章中关于构造器重写的介绍性报道;转而将更多的注意力放到新增的部分——子类的新功能,以及如何通过重写(overrides)修改已有的功能。另外,小节 重写属性的Getters和Setters(Overriding Property Getters and Setters) 中的例子已经被替换为展示如何重写一个 description 属性. (而关于如何在子类的构造器中修改继承属性的默认值的例子,已经被移到 构造过程(Initialization) 这一章.) +
  • +
  • + 更新了 构造器的继承与重写(Initializer Inheritance and Overriding) 小节以标示: 重写一个特定的构造器必须使用 override 修饰符. +
  • +
  • + 更新 Required构造器(Required Initializers) 小节以标示:required 修饰符现在需要出现在所有子类的required构造器的声明中, 而required构造器的实现,现在可以仅从父类自动继承。 +
  • +
  • + 中置(Infix)的 运算符函数(Operator Functions) 不再需要@infix 属性. +
  • +
  • + 前置和后置运算符(Prefix and Postfix Operators)@prefix@postfix 属性,已变更为 prefixpostfix 声明修饰符(declaration modifiers). +
  • +
  • + 增加一条注解:当Prefix和postfix运算符被作用于同一个操作数时,关于前置和后置运算符(Prefix and Postfix Operators)的顺序(postfix运算符会先被执行) +
  • +
  • + 在运算符函数(Operator functions)中, 组合赋值运算符(Compound Assignment Operators) 不再使用 @assignment 属性来定义函数. +
  • +
  • + 在这个版本中,在定义自定义操作符(Custom Operators) 时,修饰符(Modifiers)的出现顺序发生变化。比如, 现在,你该编写 prefix operator, 而不是 operator prefix. +
  • +
  • + 增加信息:关于dynamic 声明修饰符(declaration modifier),于章节 声明修饰符(Declaration Modifiers). +
  • +
  • + 增加信息:字面量Literals 的类型推导(type inference) +
  • +
  • + 为章节Curried Functions添加了更多的信息. +
  • + +
    发布日期
    发布日期 语法变更记录
    2014-08-04
    2014-08-04 -
    @@ -520,59 +521,59 @@ - - + + - - + + +
  • + 加入新的章节 权限控制(Access Control). +
  • +
  • + 更新了章节 字符串和字符(Strings and Characters) 用以表明,在Swift中,Character 类型现在代表的是扩展字符集(extended grapheme cluster)中的一个Unicode,为此,新增了小节 Extended Grapheme Clusters 。同时,为小节 Unicode标量(Unicode Scalars)字符串比较(Comparing Strings)增加了更多内容. +
  • +
  • + 更新章节字符串字面量(String Literals):在一个字符串中,Unicode标量(Unicode scalars) 以 \u{n}的形式来表示, n 是一个最大可以有8位的16进制数(hexadecimal digits) +
  • +
  • + NSString length 属性已被映射到Swift的内建 String类型。(注意,这两属性的类型是utf16Count,而非 utf16count). +
  • +
  • + Swift的内建 String 类型不再拥有 uppercaseStringlowercaseString 属性.其对应部分在章节 字符串和字符(Strings and Characters)已经被删除, 并且各种对应的代码用例也已被更新. +
  • +
  • + 加入新的章节 没有外部名的构造器参数(Initializer Parameters Without External Names). +
  • +
  • + 加入新的章节 Required构造器(Required Initializers). +
  • +
  • + 加入新的章节 可选元祖(函数)返回类型 (Optional Tuple Return Types). +
  • +
  • + 更新章节 类型标注(Type Annotations) :多个相关变量可以用“类型标注”(type annotaion)在同一行中声明为同一类型。 +
  • +
  • + @optional, @lazy, @final, @required 等关键字被更新为 optional, lazy, final, required 参见声明修饰符(Declaration Modifiers). +
  • +
  • + 更新整本书 —— 引用 ..< 作为区间运算符(Half-Open Range Operator) (取代原先的.. ). +
  • +
  • + 更新了小节 读取和修改字典(Accessing and Modifying a Dictionary)Dictionary 现在早呢更加了一个 Boolean型的属性: isEmpty +
  • +
  • + 解释了哪些字符(集)可被用来定义自定义操作符 (Custom Operators) +
  • +
  • + nil 和布尔运算中的 truefalse 现在被定义为字面量Literals. +
  • + +
    发布日期
    发布日期 语法变更记录
    2014-07-21
    2014-07-21 -
    @@ -582,41 +583,41 @@ - - + + - - + + +
  • + Swift 中的数组 (Array) 类型从现在起具备了完整的值语义。具体信息被更新到 集合的可变性(Mutability of Collections)数组(Arrays) 两小节,以反映这个新的变化. 此外,还解释了如何 给Strings, Arrays和Dictionaries进行赋值和拷贝 (Assignment and Copy Behavior for Strings, Arrays, and Dictionaries). +
  • +
  • + 数组类型速记语法(Array Type Shorthand Syntax)SomeType[].更新为[SomeType] +
  • +
  • + 加入新的小节:字典类型的速记语法(Dictionary Type Shorthand Syntax).: [KeyType: ValueType]. +
  • +
  • + 加入新的小节:字典键类型的哈希值(Hash Values for Dictionary Key Types). +
  • +
  • + 例子 闭包表达式 (Closure Expressions) 中使用新的全局函数 sorted 取代原先的全局函数 sort 去展示如何返回一个全新的数组. +
  • +
  • + 更新关于 结构体逐一成员构造器 (Memberwise Initializers for Structure Types) 的描述:即使结构体的成员没有默认值,逐一成员构造器也可以自动获得。 +
  • +
  • + 区间运算符(Half-Open Range Operator)..更新到..< +
  • +
  • + 添加一个例子 扩展一个泛型(Extending a Generic Type) +
  • + +
    发布日期
    发布日期 语法变更记录
    2014-07-7
    2014-07-7 -
    @@ -626,21 +627,21 @@ - - + + - - + + - +
  • + 发布新的文档用以详述Swift - 苹果公司针对iOS和OS X应用的全新开发语言 +
  • + + +
    发布日期
    发布日期 语法变更记录
    2014-07-7
    2014-07-7
      -
    • - 发布新的文档用以详述Swift - 苹果公司针对iOS和OS X应用的全新开发语言 -
    • -
    -
    @@ -649,20 +650,20 @@ - - + + - - + + - +
  • + 苹果全球开发者大会WWDC2014召开,发布了苹果最新的开发语言Swift,并释放出XCode6 Beta1版本 +
  • + + +
    发布日期
    发布日期 语法变更记录
    2014-06-3
    2014-06-3
      -
    • - 苹果全球开发者大会WWDC2014召开,发布了苹果最新的开发语言Swift,并释放出XCode6 Beta1版本 -
    • -
    -
    diff --git a/source/chapter2/03_Strings_and_Characters.md b/source/chapter2/03_Strings_and_Characters.md index a94ad3ba..65c635c3 100755 --- a/source/chapter2/03_Strings_and_Characters.md +++ b/source/chapter2/03_Strings_and_Characters.md @@ -25,17 +25,17 @@ `String`是例如"hello, world","albatross"这样的有序的`Character`(字符)类型的值的集合。通过`String`类型来表示。 -一个`String`的内容可以用变量的方式读取,它包括一个`Character`值的集合。 +一个`String`的内容可以用变量的方式读取,它包括一个`Character`值的集合。 创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读。 字符串连接操作只需要简单地通过`+`符号将两个字符串相连即可。 -与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。你也可以在字符串内插过程中使用字符串插入常量、变量、字面量表达成更长的字符串,这样可以很容易的创建自定义的字符串值,进行展示、存储以及打印。 +与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。你也可以在字符串内插过程中使用字符串插入常量、变量、字面量表达成更长的字符串,这样可以很容易的创建自定义的字符串值,进行展示、存储以及打印。 尽管语法简易,但`String`类型是一种快速、现代化的字符串实现。 每一个字符串都是由编码无关的 Unicode 字符组成,并支持访问字符的多种 Unicode 表示形式(representations)。 你也可以在常量、变量、字面量和表达式中进行字符串插值操作,这可以帮助你轻松创建用于展示、存储和打印的自定义字符串。 -> 注意: +> 注意: > Swift 的`String`类型与 Foundation `NSString`类进行了无缝桥接。就像 [`AnyObject`类型](./19_Type_Casting.html#anyobject) 中提到的一样,在使用 Cocoa 中的 Foundation 框架时,您可以将创建的任何字符串的值转换成`NSString`,并调用任意的`NSString` API。您也可以在任意要求传入`NSString`实例作为参数的 API 中用`String`类型的值代替。 -> 更多关于在 Foundation 和 Cocoa 中使用`String`的信息请查看 *[Using Swift with Cocoa and Objective-C (Swift 2)](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html#//apple_ref/doc/uid/TP40014216)*。 +> 更多关于在 Foundation 和 Cocoa 中使用`String`的信息请查看 *[Using Swift with Cocoa and Objective-C (Swift 2)](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html#//apple_ref/doc/uid/TP40014216)*。 @@ -51,7 +51,7 @@ let someString = "Some string literal value" 注意`someString`常量通过字符串字面量进行初始化,Swift 会推断该常量为`String`类型。 -> 注意: +> 注意: 更多关于在字符串字面量中使用特殊字符的信息,请查看 [字符串字面量的特殊字符](#special_characters_in_string_literals) 。 @@ -90,7 +90,7 @@ constantString += " and another Highlander" // 这会报告一个编译错误 (compile-time error) - 常量字符串不可以被修改。 ``` -> 注意: +> 注意: 在 Objective-C 和 Cocoa 中,您需要通过选择两个不同的类(`NSString`和`NSMutableString`)来指定字符串是否可以被修改。 @@ -113,14 +113,14 @@ Swift 默认字符串拷贝的方式保证了在函数/方法中传递的是字 您可通过`for-in`循环来遍历字符串中的`characters`属性来获取每一个字符的值: ```swift -for character in "Dog!�".characters { +for character in "Dog!🐶".characters { print(character) } // D // o // g // ! -// � +// 🐶 ``` `for-in`循环在 [For Loops](./05_Control_Flow.html#for_loops) 中进行了详细描述。 @@ -133,10 +133,10 @@ let exclamationMark: Character = "!" 字符串可以通过传递一个值类型为`Character`的数组作为自变量来初始化: ```swift -let catCharacters: [Character] = ["C", "a", "t", "!", "�"] +let catCharacters: [Character] = ["C", "a", "t", "!", "🐱"] let catString = String(catCharacters) print(catString) -// 打印输出:"Cat!�" +// 打印输出:"Cat!🐱" ``` @@ -167,7 +167,7 @@ welcome.append(exclamationMark) // welcome 现在等于 "hello there!" ``` -> 注意: +> 注意: 您不能将一个字符串或者字符添加到一个已经存在的字符变量上,因为字符变量只能包含一个字符。 @@ -190,7 +190,7 @@ let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)" 该表达式计算`Double(multiplier) * 2.5`的值并将结果 (`7.5`) 插入到字符串中。 在这个例子中,表达式写为`\(Double(multiplier) * 2.5)`并包含在字符串字面量中。 -> 注意: +> 注意: > 插值字符串中写在括号中的表达式不能包含非转义双引号 (`"`) 和反斜杠 (`\`),并且不能包含回车或换行符。 @@ -199,13 +199,13 @@ let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)" Unicode 是一个国际标准,用于文本的编码和表示。 它使您可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。 -Swift 的`String`和`Character`类型是完全兼容 Unicode 标准的。 +Swift 的`String`和`Character`类型是完全兼容 Unicode 标准的。 ### Unicode 标量(Unicode Scalars) Swift 的`String`类型是基于 *Unicode 标量* 建立的。 -Unicode 标量是对应字符或者修饰符的唯一的21位数字,例如`U+0061`表示小写的拉丁字母(`LATIN SMALL LETTER A`)("`a`"),`U+1F425`表示小鸡表情(`FRONT-FACING BABY CHICK`) ("`�`")。 +Unicode 标量是对应字符或者修饰符的唯一的21位数字,例如`U+0061`表示小写的拉丁字母(`LATIN SMALL LETTER A`)("`a`"),`U+1F425`表示小鸡表情(`FRONT-FACING BABY CHICK`) ("`🐥`")。 > 注意: > Unicode *码位(code poing)* 的范围是`U+0000`到`U+D7FF`或者`U+E000`到`U+10FFFF`。Unicode 标量不包括 Unicode *代理项(surrogate pair)* 码位,其码位范围是`U+D800`到`U+DFFF`。 @@ -229,10 +229,10 @@ let wiseWords = "\"Imagination is more important than knowledge\" - Einstein" // "Imageination is more important than knowledge" - Enistein let dollarSign = "\u{24}" // $, Unicode 标量 U+0024 let blackHeart = "\u{2665}" // ♥, Unicode 标量 U+2665 -let sparklingHeart = "\u{1F496}" // �, Unicode 标量 U+1F496 +let sparklingHeart = "\u{1F496}" // 💖, Unicode 标量 U+1F496 ``` - + ### 可扩展的字形群集(Extended Grapheme Clusters) 每一个 Swift 的`Character`类型代表一个可扩展的字形群。 @@ -265,14 +265,14 @@ let decomposed: Character = "\u{1112}\u{1161}\u{11AB}" // ᄒ, ᅡ, ᆫ ```swift let enclosedEAcute: Character = "\u{E9}\u{20DD}" // enclosedEAcute 是 é⃝ -``` +``` 局部的指示符号的 Unicode 标量可以组合成一个单一的`Character`值,例如`REGIONAL INDICATOR SYMBOL LETTER U`(`U+1F1FA`)和`REGIONAL INDICATOR SYMBOL LETTER S`(`U+1F1F8`): ```swift let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}" -// regionalIndicatorForUS 是 �� +// regionalIndicatorForUS 是 🇺🇸 ``` @@ -281,7 +281,7 @@ let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}" 如果想要获得一个字符串中`Character`值的数量,可以使用字符串的`characters`属性的`count`属性: ```swift -let unusualMenagerie = "Koala �, Snail �, Penguin �, Dromedary �" +let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪" print("unusualMenagerie has \(unusualMenagerie.characters.count) characters") // 打印输出 "unusualMenagerie has 40 characters" ``` @@ -294,16 +294,16 @@ print("unusualMenagerie has \(unusualMenagerie.characters.count) characters") var word = "cafe" print("the number of characters in \(word) is \(word.characters.count)") // 打印输出 "the number of characters in cafe is 4" - + word += "\u{301}" // COMBINING ACUTE ACCENT, U+0301 - + print("the number of characters in \(word) is \(word.characters.count)") // 打印输出 "the number of characters in café is 4" ``` -> 注意: +> 注意: > 可扩展的字符群集可以组成一个或者多个 Unicode 标量。这意味着不同的字符以及相同字符的不同表示方式可能需要不同数量的内存空间来存储。所以 Swift 中的字符在一个字符串中并不一定占用相同的内存空间数量。因此在没有获取字符串的可扩展的字符群的范围时候,就不能计算出字符串的字符数量。如果您正在处理一个长字符串,需要注意`characters`属性必须遍历全部的 Unicode 标量,来确定字符串的字符数量。 -> +> > 另外需要注意的是通过`characters`属性返回的字符数量并不总是与包含相同字符的`NSString`的`length`属性相同。`NSString`的`length`属性是利用 UTF-16 表示的十六位代码单元数字,而不是 Unicode 可扩展的字符群集。作为佐证,当一个`NSString`的`length`属性被一个Swift的`String`值访问时,实际上是调用了`utf16Count`。 @@ -345,7 +345,7 @@ greeting[greeting.endIndex] // error greeting.endIndex.successor() // error ``` -使用`characters`属性的`indices`属性会创建一个包含全部索引的范围(`Range`),用来在一个字符串中访问单个字符。 +使用`characters`属性的`indices`属性会创建一个包含全部索引的范围(`Range`),用来在一个字符串中访问单个字符。 ```swift for index in greeting.characters.indices { @@ -515,7 +515,7 @@ Swift 提供了几种不同的方式来访问字符串的 Unicode 表示形式 下面由`D``o``g``‼`(`DOUBLE EXCLAMATION MARK`, Unicode 标量 `U+203C`)和`�`(`DOG FACE`,Unicode 标量为`U+1F436`)组成的字符串中的每一个字符代表着一种不同的表示: ```swift -let dogString = "Dog‼�" +let dogString = "Dog‼🐶" ``` @@ -532,7 +532,7 @@ let dogString = "Dog‼�" o
    U+006F g
    U+0067 ‼
    U+203C - �
    U+1F436 + 🐶
    U+1F436 UTF-8
    Code Unit @@ -589,7 +589,7 @@ print("") o
    U+006F g
    U+0067 ‼
    U+203C - �
    U+1F436 + 🐶
    U+1F436 UTF-16
    Code Unit @@ -644,7 +644,7 @@ print("") o
    U+006F g
    U+0067 ‼
    U+203C - �
    U+1F436 + 🐶
    U+1F436 UTF-16
    Code Unit @@ -688,5 +688,5 @@ for scalar in dogString.unicodeScalars { // o // g // ‼ -// � +// 🐶 ```