设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

Swift 2中字符串设计的背后思想

2015-8-15 18:59| 发布者: joejoe0332| 查看: 657| 评论: 0|原作者: csdn|来自: csdn

摘要: Swift提供高性能、兼容Unicode的String作为标准库的一部分,在Swift 2.0中,String类型不再符合CollectionType协议,曾经String是字符的集合,类似于array。现在,String提供了一个公开字符集视图的charactes属性。 ...

本文出自:苹果官方Swift博客,译文出自:开发技术前线,译者:MrLoong 

  Swift提供高性能、兼容Unicode的String作为标准库的一部分,在Swift 2.0中,String类型不再符合CollectionType协议,曾经String是字符的集合,类似于array。现在,String提供了一个公开字符集视图的charactes属性。

  为什么会变?虽然模拟一个字符串作为字符集合看起来很自然,但是String类型的行为还是与Array、Set、Dictionary这种集合类型有很大的区别。这一直存在着,但是随着Swift 2协议扩展的增加,这些差异使得有必要做出一些基本的改变。

与之不同的Sum

  当你添加一个元素到集合中,你期望集合将包含这个元素。就是说,当你将一个值添加到数组中时,该数组包含该值。就像应用dictionary或set。然而,当你在一个string中添加一个组合标记字符串,字符串本身的内容被更改。

  考虑字符串cafe,其中有四个字符串:c、a、f和e:

  1. var letters: [Character] = ["c""a""f""e"]  
  2. var string: String = String(letters)  
  3.    
  4. print(letters.count) // 4  
  5. print(string) // cafe  
  6. print(string.characters.count) // 4  

  如果你添加一个组合字符U+0301和´,字符串仍然有四个字符,但是现在最后一位是é。

  1. let acuteAccent: Character = "\u{0301}" // ´ COMBINING ACUTE ACCENT' (U+0301)  
  2.    
  3. string.append(acuteAccent)  
  4. print(string.characters.count) // 4  
  5. print(string.characters.last!) // é  

  在刚刚这个字符串的字符属性不包涵原始的小写字母e,也不包涵只是附加的´。相反,字符串中现在包涵一个小写“e”,带有é:

  1. string.characters.contains("e"// false  
  2. string.characters.contains("´"// false  
  3. string.characters.contains("é"// true  

  如果我们像其它集合那样处理字符串,这个结果将会让我们惊讶,添加UIColor.redColor()和UIColor.greenColor(),然后设置他包涵UIColor.yellowColor()。

根据文字内容判断

  字符串和集合之间的另一个区别是它们确定相等的方式:

  • 如果两个array都有相同的数目,并且每对元素在相应的指数是相等的,两个array相等。
  • 如果两个sets都有相同的数目,并且每个元素包含在第一个元素也包含在第二个。
  • 如果两个dictionaries有相同的key、value,则两个dictionaries相等。

  然而string基于正则等价平等。如果有相同的语言意思和外观特征,甚至如果它们由不同的Unicode组成,则表示等效。

  考虑下韩语协作系统,由24个字母组成,或是Jamo,代表个别的辅音和元音。当把这些字母写出来的时候,每个音节都是字母组合起来的。字符“가”([GA])是由字母“ᄀ”([ ])和“ᅡ”[一]。在Swift中,字符串是相同的,无论是由分解或预作字符序列:

  1. let decomposed = "\u{1100}\u{1161}" // ᄀ + ᅡ  
  2. let precomposed = "\u{AC00}" // 가  
  3.    
  4. decomposed == precomposed // true  

  同样,这种行为与任何快速的收集类型有很大的不同。这将是令人惊讶的价值被认为等于阵列。

取决于你的观点


  如果我们把“CAFé”前面的例子,由分解的特征[C,A,F,E ]和[´],这里有各种字符串的视图将包括:

  • characters属性段的文本扩展字形集群,这是一个近似的用户感知的字符(在这种情况下,c, a, f, and é)。因为一个字符串必须遍历它的每一个位置(每个位置称为一个代码点),为了确定字符边界.访问此属性的线性输出O(n)时间。当处理字符串包含人类可读的文本,高级语言环境敏感的Unicode编码算法,尤其使用localizedstandardcompare用(_:)方法和localizedlowercasestring财产,应优先采用字符处理的特点。
  • UTF8,UTF16性质为UTF 8和16表示–utf–提供代码.这些值对应于将实际的字节写入到一个文件,当翻译到和从一个特定的编码。UTF-8编码单元被许多POSIX字符串处理API.而UTF-16代码单元中使用的Cocoa & Cocoa Touch表示字符串的长度和偏移量。
有关字符串和字符的快速工作的更多信息, 阅读 The Swift Programming Language the Swift Standard Library Reference

酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部