String 和 NSString 在 Swift 中的 Struct 中的区别



我一直在阅读Apple开发人员文档,String是值类型,NSString(Foundation(是引用类型,类似地struct是值类型,但是如果我在struct内部使用NSString,它就像一个String.你能详细说明一下区别吗?

例:

struct testing {
static var testingstring1 = NSString()
static var testingstring2 = String()
}

字符串是一个结构

体在 Swift Module 中

公共结构字符串

{

}

NSString 是一个类

在基础模块中

开放类 NSString : NSObject

{

}

我认为问题是当您初始化 NSString 时,Swift 会自动将其更改为字符串。尝试像这样初始化 NSString,看看这是否会导致编译错误:

var testingstring1: NSString = "testingstring1" as NSString

以下是两种语言在 Objective-C 的引用类型和 Swift 的值类型方面的桥接的解释: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html

Swift 可与 Objective-C互操作,并将一些 Objective-C 类型转换为 Swift 类型。

可以在 Obj-C 和 Swift 之间转换的类型称为桥接类型。字符串和NSString是此类桥接类型的示例,因此您可以将NSString分配给String变量。

String-NSString 不匹配:

NSString 概念涉及 UTF-16 代码点。每种方法都有其优点。与 Swift 相比,NSString 方法具有出色的速度和效率,Swift 必须走弦来研究字符是如何构建的;但 Swift 方式给出了你直觉认为的正确答案。为了强调这种差异,非文字 Swift 字符串没有长度属性;它与 NSString 长度的模拟是其 UTF16 属性的计数。 幸运的是,元素不匹配在实践中并不经常出现;但它可能会出现。这是一个很好的测试用例:

let s = "Hau{030A}kon"
print(s.characters.count) // 5
let length = (s as NSString).length // or: s.utf16.count
print(length) // 6

我们使用 Unicode 代码点创建了字符串(挪威语名称 Håkon(,该代码点与前面的代码点组合以形成一个带有环的字符。Swift 遍历整个字符串,因此它会规范化组合并报告五个字符。Cocoa 只是一眼看到这个字符串包含六个 16 位代码点。

最新更新