/**
(2)字符串拷贝
*/
var swiftStr: String = "Hello"
var swiftStr1: String = swiftStr
/**
public struct String {
/// Creates an empty string.
public init()
我们点击安住Command 点击String可以看到是 结构体类型,值类型
值类型的赋值操作是深拷贝,
所有这个字符串的这种操作都是深拷贝。
*/
/**
我们可以验证一下上面的赋值操作是否是深拷贝
*/
// 改变 swiftStr1
swiftStr1 += " World"
print("swiftStr==\(swiftStr)")
print("swiftStr1==\(swiftStr1)")
/**
swiftStr==Hello
swiftStr1==Hello World
*/
/**
我们可以看到改变swiftStr1后,swiftStr并没有被改变啊。
所以上面是深拷贝。
*/
print("swiftStr.Address==\(Unmanaged<AnyObject>.passUnretained(swiftStr as AnyObject).toOpaque())")
print("swiftStr1.Address==\(Unmanaged<AnyObject>.passUnretained(swiftStr1 as AnyObject).toOpaque())")
/**
打印出来的地址也不一样啊,所以是深拷贝。
swiftStr.Address==0x0000608000051e20
swiftStr1.Address==0x0000608000051f40
*/
var ocStr: NSMutableString = NSMutableString.init(string: "balabala")
/**
按住Command 点击NSMutableString,进入
open class NSMutableString : NSString {
/* NSMutableString primitive (funnel) method. See below for the other mutation methods.
*/
open func replaceCharacters(in range: NSRange,with aString: String)
}
可以看到的是 class类型,是引用类型,所以是浅拷贝。
*/
var ocStr1 = ocStr
// 改变ocStr1
ocStr1.insert("World",at: ocStr.length)
print("ocStr==\(ocStr)")
print("ocStr1==\(ocStr1)")
/**
ocStr==balabalaWorld
ocStr1==balabalaWorld
改变ocStr1后,ocStr也改变了,是浅拷贝。
这些都是系统来替我们做的,程序员不需要做。
*/
原文链接:https://www.f2er.com/swift/322360.html