相关疑难解决方法(0)

Swift,如何实现基于对象引用的Hashable协议?

在Java之后我开始学习swift.在Java中,我可以使用任何对象作为HashSet的键,因为它具有默认值hashCodeequals基于对象标识符.如何在Swift中实现相同的行为?

hashtable swift

17
推荐指数
4
解决办法
4834
查看次数

Swift,Strings和Memory地址

有一些我不了解Swift如何管理内存地址 String(s)

1.参考类型

这里fooboo是2个指针指向相同的内存位置.

class Foo { }

let foo = Foo()
let boo = foo

unsafeAddressOf(foo) // "UnsafePointer(0x7FCD13719BE0)"
unsafeAddressOf(boo) // "UnsafePointer(0x7FCD13719BE0)" 
Run Code Online (Sandbox Code Playgroud)

好.

2.价值类型

let word0 = "hello"
let word1 = word0
Run Code Online (Sandbox Code Playgroud)

现在,word0word1value types但这里的copy on write机制是参与.

[...]但是,当绝对必要时,Swift仅在幕后执行实际复制.Swift管理所有值复制以确保最佳性能,您不应该避免分配以尝试抢占此优化.https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-XID_134

那他们为什么有2个不同的内存地址呢?

unsafeAddressOf(word0) // "UnsafePointer(0x7FCD1342ACE0)"
unsafeAddressOf(word1) // "UnsafePointer(0x7FCD13414260)"
Run Code Online (Sandbox Code Playgroud)

3.更多

同时请注意,Stringstruct那个莫名其妙符合AnyObject.

使用Xcode 7 GM Playground和Swift 2.0进行测试.

string value-type memory-address swift

12
推荐指数
1
解决办法
4425
查看次数

使用ObjectIdentifier()和'==='运算符之间的区别

假设我在Swift中实现了一个根类,我声明它采用了Equatable协议(我希望能够判断我的类型的数组是否包含给定的实例).

有什么区别 - 在这种特定情况下 - 在实现协议所需的==运算符之间有什么区别:

public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {

    return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
}
Run Code Online (Sandbox Code Playgroud)

......而不是这样做:

public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {

    return (lhs === rhs)
}
Run Code Online (Sandbox Code Playgroud)

作为参考,这是文档所说的ObjectIdentifier():

类实例或元类型的唯一标识符.在Swift中,只有类实例和元类型具有唯一的标识.结构,枚举,函数或元组没有身份概念.

......这就是Swift编程语言(Swift 3)的"基本操作符"部分对===运算符的说法:

注意

Swift还提供了两个标识运算符(===!==),用于测试两个对象引用是否都引用同一个对象实例.有关更多信息,请参阅类和结构.

swift equatable

7
推荐指数
1
解决办法
2359
查看次数