阅读更多

0顶
0踩

移动开发

转载新闻 Swift 2中字符串设计的背后思想

2015-08-14 14:57 by 副主编 mengyidan1988 评论(0) 有4291人浏览
本文出自:苹果官方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:
var letters: [Character] = ["c", "a", "f", "e"]
var string: String = String(letters)
 
print(letters.count) // 4
print(string) // cafe
print(string.characters.count) // 4

如果你添加一个组合字符U+0301和´,字符串仍然有四个字符,但是现在最后一位是é。
let acuteAccent: Character = "\u{0301}" // ´ COMBINING ACUTE ACCENT' (U+0301)
 
string.append(acuteAccent)
print(string.characters.count) // 4
print(string.characters.last!) // é

在刚刚这个字符串的字符属性不包涵原始的小写字母e,也不包涵只是附加的´。相反,字符串中现在包涵一个小写“e”,带有é:
string.characters.contains("e") // false
string.characters.contains("´") // false
string.characters.contains("é") // true

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

根据文字内容判断

字符串和集合之间的另一个区别是它们确定相等的方式:
  • 如果两个array都有相同的数目,并且每对元素在相应的指数是相等的,两个array相等。
  • 如果两个sets都有相同的数目,并且每个元素包含在第一个元素也包含在第二个。
  • 如果两个dictionaries有相同的key、value,则两个dictionaries相等。

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

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

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

取决于你的观点
  • characters is a collection of Character values, or  extended grapheme clusters.
  • unicodeScalars is a collection of  Unicode scalar values.
  • utf8 is a collection of  UTF–8 code units.
  • utf16 is a collection of  UTF–16 code units.

如果我们把“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 Languagethe Swift Standard Library Reference
  • 大小: 26.7 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • node.js

    IDE Hbuild WebStorm HbuildX Eclipse 编辑器 Atom Visual Studio Code Sublime Text node命令行 node 回车 运行 window a. 找到目标目录-》地址栏输入cmd-》node 文件名.js | node 文件名 b. 当前目录->右键->git ...

  • Tomcat(三)Tomcat配置文件Server.xml解析

    Tomcat配置文件Server.xml解析一 核心的解析逻辑1.1 parseServerXml二 XML文件解析方法2.1 预加载DOM树2.2 事件机制的SAX三 Digester3.1 Digester基本架构3.2 Digester解析XML文档的流程3.3 使用流程四 Digester解析...

  • 4.jvm入门到精通

    ( 应 用 ) A p p C l a s s L o a d e r 类 加 载 器 : 应 用 类 加 载 器 , 我 们 工 作 中 接 触 最 多 的 也 是 这 个 类 加 载 器 , 它 由 s u n . m i s c . L a u n c h e r JAVA_HOME/jre/lib下的文件 ...

  • 船新 IDEA 2020.3 插件大合集,个个都是精品!

    点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 8:55 更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2020 超神之路,很肝~...

  • 8. JVM-堆

    不是立即GC,如果立即GC会影响用户体验,因为经常在GC,会有卡顿(Stop The World) 堆,是GC(Garbage Collection,垃圾收集器)执行垃圾回收的重点区域。 2.1. 堆内存细分 Java 7及之前堆内存逻辑上分为三部分:...

  • usage.txt-2

    $>./debian/rules build 调试eclipse ---------------- $>dpkg-source -x /home/vsftpd/web/nginx-1.2.1/apt/mirror/ftp.us.debian.org/debian/pool/main/e/eclipse/eclipse_3.8.0~rc4-1.dsc $>cd eclipse-3.8.0~rc...

  • 深入理解java虚拟机-1.自动内存管理

    1.2 垃圾收集器与内存分配策略 概述 对象已死? 引用计数算法 可达性分析算法 再谈引用(JDK 1.2版之后的4种引用) 生存还是死亡 回收方法区 垃圾收集算法 分代收集理论 标记-清除算法 标记-复制算法 标记-整理算法 ...

  • usage.txt-1

    选中完毕后,按大写的I键,此时下方会提示进入"insert"模式,插入你要插入的注释符号.eg.# 最后按ESC,你就会发现多行代码已经被注释掉了. ltsp 默认桌面启动管理器是gdm3,这里需要修改它: gnome3 回到经典模式,...

  • Java学习笔记(No.16)

    } } 3.2、运行结果(Run Result) 其运行结果,如以下信息所示。 true true true true false 2 false true [Ljava.lang.Object;@119d7047 [1, 2] true true true true true false 3 false true [Ljava.lang.Object;@...

  • 执行引擎.

    机器指令与CPU紧密相关,所以不同种类的CPU所对应的机器指令也就不同 3.2 指令 由于机器码是有0和1组成的二进制序列,可读性实在太差,于是人们发明了指令。 指令就是把机器码中特定的0和1序列,简化成对应的指令...

  • java面试.1

    - 1.1、设计阶段调优 - 1.2、写入调优 - 1.3、查询调优 - 1.4、其他调优 2、elasticsearch 的倒排索引是什么 3、elasticsearch 索引数据多了怎么办,如何调优,部署 - 3.1 动态索引层面 - 3.2 存储层面 - 3.3 部署...

  • [JVM]12.垃圾回收

    只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。 那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活...

  • 16. JVM之垃圾回收相关算法

    只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。 那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活...

  • 笔记整理nodeJS

    IDE Hbuild WebStorm HbuildX Eclipse 编辑器 Atom Visual Studio Code Sublime Text node命令行 node 回车 运行 window a. 找到目标目录-》地址栏输入cmd-》node 文件名.js | node 文件名 b. 当前目录->右键->git ...

  • helloword.java.bak,java基础-----第一个程序helloword与编码规范

    集成开发工具:eclipse、myeclipse 3.2 注释 分类: 单行注释:// 多行注释:/* */ 文档注释:/** */ 作用: ① 对所写的程序进行解释说明,增强可读性。方便自己,方便别人 ② 调试所写的代码 特点: ①单行注释...

  • 14.javase-基础加强-JVM内存模型

    每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉,如图: 缺点:只能用一半的内存 应用场景:堆内存新生代采用. 3.3 标记整理算法 结合了以上两个算法,为了避免缺陷而提出...

  • 基于Struts2.3.x+Spring3.2.x+Hibernate4.2.x+EasyUI1.3.4+Maven架构的示例程序

    基于Struts2.3.x+Spring3.2.x+Hibernate4.2.x+EasyUI1.3.4+Maven架构的示例程序 源代码下载地址:http://www.zuidaima.com/share/1675482798951424.htm

  • 【JVM · GC】垃圾回收 相关概念

    只有被标记为已经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为 垃圾标记阶段。 那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活...

  • java jstat mbean_JVM详解3.JDK监控和故障处理工具

    这项功能对实际生产中的程序很有意义:经常遇到程序出现问题,但排查错误的一些必要信息,譬如方法参数、返回值等,在开发时并没有打印到日志之中,以至于不得不停掉服务,通过调试增量来加入日志代码以解决问题。...

  • 从vim转向Emacs _ emacser.com文章收集

    3.2 gdb界面 3.3 小结 4 调试:设置断点,控制程序流程 4.1 设置、删除断点 4.2 运行程序 4.3 单步执行、运行到光标处 4.4 继续运行程序 4.5 小结 5 察看变量的值 ...

Global site tag (gtag.js) - Google Analytics