NSString 是 Objective-C 中的类,表示不可变的字符串。在 Swift 中,NSString 作为一个桥接类型,允许使用 NSString 的旧代码库进行交互。虽然 Swift 提供了原生的 String 类型,但 NSString 仍然是处理与文件路径、URL 和其他基于字符串的操作时的一个重要类,尤其是在与 Foundation 框架的某些类交互时。
NSString 和 String 之间的关系
在 Swift 中,NSString 是通过桥接 (bridging) 与 String 互操作的。可以将 String 转换为 NSString,反之亦然。
String 是 Swift 原生的字符串类型,具有值类型(值拷贝的特性)。
NSString 是在 Objective-C 中的不可变字符串类型,具有引用类型(对象共享特性)。
虽然 Swift 的 String 类型更常用,但由于某些功能(特别是与文件路径和 URL 相关的操作)在 NSString 中实现,很多情况下我们需要将 String 转换为 NSString。
NSString 常用方法
NSString 提供了许多方法来处理字符串,特别是在文件路径、编码、正则表达式等方面。
常见方法:
pathExtension:用于从文件路径中提取扩展名。
stringByAppendingPathComponent:将一个路径组件追加到当前字符串(文件路径)上。
substringFromIndex、substringToIndex:截取子字符串。
hasPrefix 和 hasSuffix:检查字符串是否有指定的前缀或后缀。
如何在 Swift 中使用 NSString
1、NSString 转换为 String
在 Swift 中,NSString 自动与 String 互相桥接,因此,可以直接将 NSString 类型的对象转换为 String:
let nsString: NSString = "Hello, World!"
let swiftString: String = nsString as String
2、String 转换为 NSString
可以将 String 转换为 NSString,以便使用 NSString 提供的一些特定方法:
let swiftString: String = "Hello, World!"
let nsString: NSString = swiftString as NSString
3、使用 NSString 的方法
比如,使用 NSString 的 pathExtension 方法来获取文件扩展名:
let filename = "example.zip"
let fileExtension = (filename as NSString).pathExtension
print(fileExtension) // 输出 "zip"
NSString 常见方法
一、路径与文件名相关
1、appendingPathComponent
拼接路径:
let filePath = " /Users/me"
let extension = (filePath as NSString). appendingPathComponent("test.txt")
print(extension) // 输出 "/Users/me/test.txt"
2、appendingPathExtension
拼接扩展名:
let filePath = " file"
let extension = (filePath as NSString). appendingPathExtension("txt")
print(extension) // 输出 "file.txt"
3、deletingLastPathComponent
去掉最后一级目录:
let filePath = " /Users/me/file.txt"
let extension = (filePath as NSString). deletingLastPathComponent
print(extension) // 输出 "/Users/me/"
4、deletingPathExtension
去掉扩展名:
let filePath = "file.txt"
let extension = (filePath as NSString). deletingPathExtension
print(extension) // 输出 "file"
5、lastPathComponent
获取最后的文件名:
let filePath = "/Users/me/test.txt"
let extension = (filePath as NSString). deletingPathExtension
print(extension) // 输出 " test.txt"
6、pathExtension
获取文件扩展名:
let filePath = "example.zip"
let extension = (filePath as NSString).pathExtension
print(extension) // 输出 "zip"
7、pathComponents
按路径拆分数组:
let filePath = " /Users/me/file.txt"
let extension = (filePath as NSString).pathExtension
print(extension) // 输出 ["/", "Users", "me", "file.txt"]
二、字符串搜索
1、contains(_:)
判断字符串是否包含子串:
let text = "Hello, world!"
let result = text.contains("world")
print(result) // 输出 true
2、range(of:)
查找子串范围:
let text = "Hello, world!" as NSString
let range = text.range(of: "world")
print(range) // 输出 {7, 5}
3、hasPrefix(_:)
是否以某字符串开头:
let text = "Hello, world!" as NSString
let result = text.hasPrefix("Hello")
print(result) // 输出 true
4、hasSuffix(_:)
是否以某字符串结尾:
let text = "Hello, world!" as NSString
let result = text.hasSuffix("world!")
print(result) // 输出 true
5、compare(_:options:)
比较字符串(支持大小写敏感/不敏感等选项):
let text1 = "hello" as NSString
let text2 = "HELLO" as NSString
let result1 = text1.compare(text2 as String)
print(result1 == .orderedSame) // 输出 false (区分大小写时不相等)
let result2 = text1.compare(text2 as String, options: .caseInsensitive)
print(result2 == .orderedSame) // 输出 true (忽略大小写时相等)
三、子串操作
1、substring(from:)
获取从指定索引开始到结尾的子串:
let text = "Hello, world!" as NSString
let substring = text.substring(from: 7)
print(substring) // 输出 "world!"
2、substring(to:)
获取从开头到指定索引(不包含该索引)的子串:
let text = "Hello, world!" as NSString
let substring = text.substring(to: 5)
print(substring) // 输出 "Hello"
3、substring(with:)
获取指定范围的子串:
let text = "Hello, world!" as NSString
let substring = text.substring(with: NSRange(location: 7, length: 5))
print(substring) // 输出 "world"
4、hasPrefix 和 hasSuffix
检查字符串是否以指定的前缀或后缀开始:
let string = "Hello, World!"
print((string as NSString).hasPrefix("Hello")) // 输出 true
print((string as NSString).hasSuffix("World!")) // 输出 true
四、大小写转换
1、lowercased
把字符串全部转换为小写:
let text = "Hello, World!" as NSString
let lower = text.lowercased
print(lower) // 输出 "hello, world!"
2、uppercased
把字符串全部转换为大写:
let text = "Hello, World!" as NSString
let upper = text.uppercased
print(upper) // 输出 "HELLO, WORLD!"
3、capitalized
把每个单词首字母大写:
let text = "hello, world!" as NSString
let capitalized = text.capitalized
print(capitalized) // 输出 "Hello, World!"
五、NSString 的路径扩展方法(Swift String 没有)
1、expandingTildeInPath
把路径中的 ~ 展开成用户主目录
let path = "~/.bash_profile" as NSString
let fullPath = path.expandingTildeInPath
print(fullPath) // 输出 "/Users/你的用户名/.bash_profile"
2、resolvingSymlinksInPath
展开符号链接:
let path = "/tmp/symlinkToFile" as NSString
let resolved = path.resolvingSymlinksInPath
print(resolved) // 输出实际文件路径,如 "/private/tmp/realFile"
3、standardizingPath
规范化路径,去掉 ..、. 等:
let path = "/Users/me/../me/file.txt" as NSString
let standardized = path.standardizingPath
print(standardized) // 输出 "/Users/me/file.txt"
为什么使用 NSString 而不是 String
在 Swift 中,大多数情况下可以使用 String 来处理字符串,但是在一些特定的场景下,可能需要使用 NSString,例如:
路径操作:NSString 提供了一些有用的文件路径操作方法(如 pathExtension 和 appendingPathComponent),这些方法在 Swift 的 String 类型中没有。
与 Objective-C 代码交互:NSString 是 Objective-C 中的标准字符串类型,很多旧的 API 仍然使用 NSString,在这种情况下需要进行类型转换。
性能优化:NSString 是不可变类型(值不会改变),在与 Foundation 框架进行交互时,通常会使用 NSString。
总结
NSString 是一个不可变字符串类,主要用于与 Objective-C 代码或与 Foundation 框架进行交互。
Swift 的 String 类型和 NSString 类型之间可以桥接,允许它们相互转换。
如果需要处理文件路径、编码等功能时,可以使用 NSString 提供的特定方法,如 pathExtension 和 appendingPathComponent。
在大多数情况下,使用 Swift 的 String 类型,但在与 NSString 的某些特定功能交互时,可能需要将 String 转换为 NSString。