既然像String 这样的类型和Foundation 对应的类时可以无缝转换的,那么我们在使用和选择的时候,有没有什么需要特别注意的呢?

简单来说,没有需要特别注意的,但还是尽可能使用原生的String 类型

原因有三。

  • 首先,虽然StringNSString 有着良好的互相转换的特性,但是现在Cocoa 所有的API 都接受返回String 类型。我们没有必要也不必给自己凭空添加麻烦去把框架中返回的字符串做一遍转换,既然Cocoa 鼓励使用String,并且为我们提供了足够的操作String 的方法,那我们为什么不直接使用呢?

  • 其次,因为在Swift 中Stringstruct,相比起NSObject 的NSString 类来说,更切合字符串的“不变”这一特性。通过配合常量赋值(let),这种不变性在多线程编程时就非常重要了,它从原理上将程序员从内存访问和操作顺序的担忧中解放出来。另外,在不触及NSString 特有操作和动态特性的时候,使用String 的方法,在性能上也会有所提升。

  • 最后,因为String 实现了像CollectionType这样的接口,所以有些Swift 的语法特性只有String 才能使用,而NSString 是没有的。一个典型的例子就是 for...in 的枚举,我们可以写:

let levels = "ABCDE"
for i in levels {print(i)
}// 输出
// A
// B
// C
// D
// E

而如果转换为NSString 的话,是无法编译的。

不过也有例外的情况。有一些NSString 的方法在String 中并没有实现。

使用String 唯一一个比较麻烦的地方在于它和Range 的配合。在NSString 中,我们在匹配字符串的时候通常使用NSRange 来表示结果或者作为输入项。而在使用String 的对应的API 时,NSRange 也会被映射成它在Swift 中且对应String 的特殊版本Range<String.Index>。这有时候会让人非常讨厌:

let levels = "ABCDE"let nsRange = NSRange.init(location: 1, length: 4)// 编译错误
// Instance method 'replacingCharacters(in:with:)' requires that 'NSRange' (aka '_NSRange') conform to 'RangeExpression'
levels.replacingCharacters(in: nsRange, with: "AAAA")let swiftRange = levels.index(levels.endIndex, offsetBy: -4)..<levels.endIndexlevels.replaceSubrange(swiftRange, with: "AAAA")
// 输出
// AAAAA

一般来说,我们可能更愿意和基于Int 的NSRange 一起工作,而不喜欢使用麻烦的Range<String.Index>。在这种情况下,将String 转换为NSString 也许是个不错的选择:

let levels = "ABCDE" as NSStringlet nsRange = NSRange.init(location: 1, length: 4)let string = levels.replacingCharacters(in: nsRange, with: "AAAA")print(string)

Swift - String 还是NSString相关推荐

  1. String与NSString关系

    2019独角兽企业重金招聘Python工程师标准>>> 在Swift中,使用字符串有可能会使用Foundation中的NSString和Swift中的String.Swift在底层能 ...

  2. Swift String常用方法

    参考Java String类, 对Swift String用法做个总结. 基础篇: 1. 字符串长度: 3种方法. let str = "12345678" let len1 = ...

  3. Swift ——String 与 Array

    Swift --String 与 Array 1. String 1.1 String 在内存中的存储 1.2 String.index 2. Array 2.1 Array 的内存结构 2.2 ar ...

  4. swift string转int_Swift进阶二:基本数据类型相关

    变量和常量 Swift中,使用关键字let来声明常量,使用关键字var来声明变量. 而在Objective-C中,如果没有特殊的指明,我们所声明的都是变量.可以通过如下几种方式来声明常量: 使用宏定义 ...

  5. swift String

    初始化空字符串 为了构造一个很长的字符串,可以创建一个空字符串作为初始值.可以将空的字符串字面量赋值给变量,也可以初始化一个新的String 实例: var emptyString = "& ...

  6. Swift String字符串版本更新特性

    var str = "Hello, playground" 字符串,Swift最基本最常用的对象之一. Swift的基本使用,增删改查我们就不说了. 基本字面量 let hello ...

  7. swift string转int_swift中结构体和类的区别(值类型和引用类型的区别)

    在swift中结构体和类有着更多的相同之处,在一般的使用中能够做到互相替换.我们可以先看看官方文档的描述: Unlike other programming languages, Swift does ...

  8. swift string,Int,Double相互转换

    import UIKitvar str = "Hello, playground" // 1 字符串转Int Double Float var str1 = "818&q ...

  9. Swift之String的简单实用

    在 Swift 中绝大多数的情况下,推荐使用 String 类型 String 是一个结构体,性能更高 String 目前具有了绝大多数 NSString 的功能 String 支持直接遍历 NSSt ...

最新文章

  1. 一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现3
  2. 读书笔记之:Boost程序库完全开发指南(Ch1-4)
  3. 演示:标准ACL的配置、及使用技巧、和相关局限
  4. UVa11300 Spreading the Wealth(数学问题)
  5. Luogu P2735 电网【真·计算几何/Pick定理】By cellur925
  6. 前端学习(1438):vue三种安装方式
  7. Git上传代码到coding.net
  8. 【UML】部署图Deployment diagram(实现图)(转)
  9. 标注工具——VoTT的调试笔记
  10. 集合框架-ArrayList,Vector,Linkedlist
  11. python工厂方法_Python设计模式:工厂方法模式初探
  12. 【软考】2018年下半年软件设计师上午试题及答案
  13. 从0开始,使用豆瓣数据集做一个基于FM和逻辑回归的电影推荐系统
  14. android 2k 屏幕 字体模糊,2k显示器上的字体模糊
  15. font在html语言中是什么意思,font标签什么意思
  16. SYSLINUX 6.03不支持64bit的ext4
  17. Android Camera模块(二)
  18. Ethereum light client
  19. QML < 5 > QML 访问C++ 类 (函数Q_INVOKABLE、枚举Q_ENUMS 、成员变量Q_PROPERTY、自定义结构体QVariantMap、List数据QVariantL
  20. 可编程渲染管线4 聚光灯阴影

热门文章

  1. 沪上首座“区块链生态谷”揭开面纱!
  2. 购买无线鼠标的单模,双模和可充电是什么意思
  3. 【猿哥学二建】第一周 考试准备
  4. win10,打开软件时总是弹出询问关闭方案
  5. 新MSN Messenger 7 功能展示!
  6. java流程审批_基于SSM框架下的JAVA企业流程审批系统
  7. oracle 不释放内存,内存不释放?解决方法
  8. 在自己的软件中使用鼠标
  9. vue自定义组件三步走
  10. NSN HLR simulator for provisioning in expect