String是结构体,NSString是类,这是它们的根本区别。

在 Swift 中,结构体struct是值类型,String是结构体,所以也是值类型。值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。

类class是引用类型,NSString是类,所以也是引用类型。与值类型不同,引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。因此,引用的是已存在的实例本身而不是其拷贝。

一、String 与 NSString 的区别
String 与 NSString 各自有自身独特的API,需要用到自身没有的API时可以相互转换。

1.1 String独有的API
   · 初始化一个String变量str:

var str = String()
str = "54321-bca"

· String的isEmpty属性:

///判断是否为空
str.isEmpty//false
  · String的sorted方法:

///字符串排序并输出字符的数组

str.sorted()//["-", "1", "2", "3", "4", "5", "a", "b", "c"]

· String的filter方法(把不想要的字符过滤掉):

str = " St ri ng "

//方法1-完整闭包

let strFiltered = str.filter { (charater) -> Bool in
charater != " "
}
print(strFiltered)//”String“

//方法2-简化版

let strFiltered2 = str.filter{ $0 != " " }
print(strFiltered2)//”String“
· String的enumerated方法: str = "String" for (index,value) in str.enumerated() {
print("\(index)-\(value)")
}
/*
0-S
1-t
2-r
3-i
4-n
5-g
*/

1.2 NSString独有的API
· 初始化一个NSString变量nsstr:

var nsstr = NSString()
nsstr = "54321"

· NSString的boolValue属性:

///判断第一个字符,首字符为 Y\y\T\t\数字 返回true,否则返回false

nsstr.boolValue//true

· NSString的isEqual属性:

///判断两个字符串是否相等

nsstr.isEqual(to: "54321")//true

· NSString的integerValue属性:

///把字符串转成整型Int,若不能转成Int则返回0
nsstr.integerValue//54321

1.3 String与NSString的API不同,用法相同
· 初始化一个String变量str,一个NSString变量nsstr:

var str = String()
var nsstr = NSString()
str = "54321-bca"
nsstr = "54321-ns"

· 获取字符串的字符数量(String用count关键字,NSString用length关键字)

///获取字符串数量

str.count//
nsstr.length//

· 字符串的截取(String截取完成返回Substring,NSString截取完成返回String)

///结果返回Substring

str.prefix(str.count-2)//"54321-b"
str.prefix(while: {"0"..."5" ~= $0})//"54321"
str.suffix(3)//"bca"
str.dropLast(4)//"54321"
str.dropFirst(2)//"321-bca"

///结果返回String

nsstr.substring(to: nsstr.length-3)//"54321"
nsstr.substring(from: 6)//"ns"
nsstr.substring(with: NSMakeRange(1, 4))//"4321"

· 添加字符到字符串结尾 (String是添加字符到自身,NSString是返回一个新的String,自身不变)

str.append("s")//()
print(str)//"54321-bcas"

//NSString不改变原来变量

let nsstr1 = nsstr.appending("s")
print(nsstr1)//"54321nss"
print(nsstr)//"54321ns"

二、String 与 NSString 的共同用法
   · 初始化一个String变量str,一个NSString变量nsstr:

var str = String()
var nsstr = NSString()
str = "54321-bca"
nsstr = "54321-ns"

· 检查字符串是否含有特定的前缀/后缀

///检查字符串是否含有特定的前缀/后缀

str.hasPrefix("54")//true
str.hasSuffix("ca")//true nsstr.hasPrefix("543")//true
nsstr.hasSuffix("ns")//true

· 使用特定字符拆分字符串并输出数组

///使用特定字符拆分字符串并输出数组

str.components(separatedBy: "-")//["54321", "bca"]

nsstr.components(separatedBy: "-")//["54321", "ns"]

· 把字符串中的字母大小写转换

///大小写字母转换(结果都返回String)

str.uppercased()//"54321-BCA“
str.lowercased()//"54321-bca” nsstr.uppercased//"54321-NS“
nsstr.lowercased//"54321-ns"

· 把字符串中的单词首字母变大写

///首字母大写(结果都返回String)

str.capitalized//"54321-Bca"

nsstr.capitalized//"54321-Ns"
 

· 把字符串前后不想要的字符去掉并返回一个新的String。不想要的字符可以是 空格.whitespaces \ 换行符.newlines \ 数字.decimalDigits \ 字母.letters \ 大写字母.uppercaseLetters 等等。

str = " \r 54321-n "
nsstr = "\r 54321-ns "

///把字符串前后的空格和换行符去掉并返回一个新的String

let strTrimed = str.trimmingCharacters(in: .whitespacesAndNewlines)
print(str)//" \r 54321-n "
print(strTrimed)//"54321-n" let nsstrTrimed = nsstr.trimmingCharacters(in: .whitespacesAndNewlines)
print(nsstr)//"\r 54321-ns "
print(nsstrTrimed)//"54321-ns"

· 把十\十六\八进制数字转字符串

//结果返回String

let hexStr = String().appendingFormat("%x",16)//十进制转十六进制,结果为"10"
let oStr = String().appendingFormat("%o",16)//十进制转八进制,结果为"20"
let dStr = String().appendingFormat("%d",0x10)//十六进制转十进制,结果为"16"
let dStr1 = String(format: "%d", 0o10)//八进制转十进制,结果为"8"

//结果返回NSString

let hexNSStr = NSString().appendingFormat("%x", 16)//十进制转十六进制,结果为"10"
let oNSStr = NSString().appendingFormat("%o",16)//十进制转八进制,结果为"20"
let dNSStr = NSString().appendingFormat("%d",0x10)//十六进制转十进制,结果为"16"
let dNSStr1 = NSString(format: "%d", 0o10)//八进制转十进制,结果为"8"

· 字符替换(如果想替换的字符找不到,则返回原来字符串)

str = "hello S"
nsstr = "hello NS" let StrReplaced = str.replacingOccurrences(of: "S", with: "amberoot")
print(StrReplaced)//"hello amberoot" let NSStrReplaced = nsstr.replacingOccurrences(of: "NS", with: "amberoot")
print(NSStrReplaced)//"hello amberoot

这位兄弟总结的不错。

原文链接:https://blog.csdn.net/amberoot/article/details/88847596

swift4之String与NSString的区别与使用的更多相关文章

  1. Swift - String与NSString的区别,以及各自的使用场景

    String是Swift里新增加的类型,它与原来的NSString可以很方便地互相转换.但在实际开发中,我们该如何选择? 1,能使用String类型就尽量使用String类型,原因如下: (1)现在C ...

  2. String,StringBuffer,StringBuilder的区别

    public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...

  3. JAVA中String与StringBuffer的区别

    String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结. 在java中有3个类来负责字符的操作. 1.C ...

  4. String 和 StringBuffer的区别

    String与StringBuffer的区别:            简单地说,就是一个常量和变量的关系.StringBuffer对象的内容可以修改:而String对象一旦产生后就不可以被修改,重新赋 ...

  5. [置顶] String StringBuffer StringBuilder的区别剖析

    这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...

  6. string与stringbuilder的区别

    1.分析string与stringbuilder的区别,我们先来看下面一段代码 首先我们使用string进行字符串的拼接 class Program { static void Main(string ...

  7. String,StringBuffer,StringBuilder的区别及其源码分析

    String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...

  8. Swift中String和NSString的一个不同之处

    我们知道在Swift中String和NSString是可以互相转换使用的-额-应该是在绝大数情况下可以互相转换使用.在某些情况下可能还有一丝丝略微的差别:比如在涉及到处理字符串中字符索引的时候. 我们 ...

  9. 【转】CString与string、char*的区别和转换

    我们在C++的开发中经常会碰到string.char*以及CString,这三种都表示字符串类型,有很多相似又不同的地方,常常让人混淆.下面详细介绍这三者的区别.联系和转换: 各自的区别 char*: ...

随机推荐

  1. SSIS部署后执行失败,无法将保护的XML节点解密

    将包属性中的 protectionLevel 设置成DontSaveSensitive 即可.

  2. 区块链学习——HyperLedger-Fabric v1.0 启动过程分析

    本章我们从fabric v1.0的e2e_cli示例开始分析整个启动过程以及在过程中的一些配置文件 首先呢,还是确保你的基本环境已经搭建完成,v1.0源码和镜像也都下载完毕 fabric启动过程中的相 ...

  3. Vue.js开发去哪儿网WebApp

    一.项目介绍 这个项目主要参考了去哪儿网的布局,完成了首页.城市选择页面.详情页面的开发. 首页:实现了多区域轮播的功能,以及多区域列表的展示: 城市选择页面:在这个页面实现了城市展示.城市搜索.城市 ...

  4. flink整合kafka报错 WARN - Bootstrap broker ip:9092 disconnected

    WARN - The configuration 'zookeeper.connect' was supplied but isn't a known config.WARN - The config ...

  5. CDH 搭建 问题

    1.  问题描述: java.sql.SQLException: Access denied for user 'xxx'@'xxx.xxx.xxx.xxx' (using password: YES ...

  6. centos无法启动之fstab

    你可能由于对磁盘管理,修改了/etc/fstab文件,进行自动挂载,但是卸载磁盘后,忘记修改/etc/fstab文件,导致了如下启动linux错误,开启进入紧急模式 error getting aut ...

  7. 一、FreeMarker实现对js和css压缩

    1.代码压缩理解:实际上就是将原有的文本中无用的注释.空行.空格去掉来压缩文件的大小.进行js和css压缩会带来如下好处:1)减小了文件的体积,减少文件占用的内存;2)减小了网络传输量和带宽占用; 3 ...

  8. Tensorflow机器学习入门——ModuleNotFoundError: No module named 'tensorflow.keras'

    这个bug的解决办法: # from tensorflow.keras import datasets, layers, models from tensorflow.python.keras imp ...

  9. Css——设置input输入框光标颜色

    在使用 input 输入框时,我们可能会遇到需要给其设置光标颜色的情况.谷歌浏览器的默认光标颜色是黑色的,GitHub 上的光标却是白色,那么这个用 CSS 怎么改变呢? 上面描述的情景有两种实现方式 ...

  10. C语言入门---第七章 C语言函数

    函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码.函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码.函数还可以接收数据, ...