我无法弄清楚这里发生了什么.附加range函数的引用就是在索引处创建递归列表3.
>>> x = range(3)
[0, 1, 2]
>>> x.append(x)
[0, 1, 2, [...]]
>>> x[3][3][3][3][0] = 5
[5, 1, 2, [...]]
Run Code Online (Sandbox Code Playgroud)
然而,当我尝试这个:
>>> x = range(3)
[0, 1, 2]
>>> x.append(range(3))
[0, 1, 2, [0, 1, 2]]
Run Code Online (Sandbox Code Playgroud)
我可以很容易地推断出第二种情况的原因,但是无法理解range函数的附加引用对附加的列表做了什么.
我正在探索Swift值类型特别是结构,以便更好地理解它在不同场景中的用途.我很惊讶地看到如何使用枚举来构建二进制搜索树,使用indirect它可以引入一层薄薄的引用语义.
enum BinarySearchTree<T: Comparable> {
case empty
case leaf(T)
indirect case node(BinarySearchTree, T, BinarySearchTree)
}
Run Code Online (Sandbox Code Playgroud)
现在提出真正的问题,我正在努力寻找的是,在值类型中引用类型会发生什么.这段关系将如何运作?像内存管理,对象生命周期.
例如
class B {
var data: Int = 0
deinit {
print("deallocated!")
}
}
struct A {
var b = B()
}
Run Code Online (Sandbox Code Playgroud)
在上述情况下,值类型包含对引用类型的引用.
deinit会被召唤?A引用同一个类实例,B或者它们是不同的. 我试图在Swift中使用Objective-C API,我必须将Swift Dictionary强制转换为NSSDictionary,但是如果我能以某种方式声明下面编写的NSDictionary,我可以浏览多余的类型转换.
typedef NSDictionary* NSDictionary<NSString *, id> *;
Run Code Online (Sandbox Code Playgroud)
在我的Objective-C API中有几个字典,我希望它们都转换成上面的typdef.