首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Swift中声明弱引用数组?

如何在Swift中声明弱引用数组?
EN

Stack Overflow用户
提问于 2014-06-10 03:34:30
回答 13查看 48.5K关注 0票数 204

我想在Swift中存储一个弱引用数组。数组本身不应该是弱引用-它的元素应该是弱引用。我认为Cocoa NSPointerArray提供了一个非类型安全的版本。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2014-06-10 04:07:46

创建通用包装器,如下所示:

代码语言:javascript
复制
class Weak<T: AnyObject> {
  weak var value : T?
  init (value: T) {
    self.value = value
  }
}

将此类的实例添加到数组中。

代码语言:javascript
复制
class Stuff {}
var weakly : [Weak<Stuff>] = [Weak(value: Stuff()), Weak(value: Stuff())]

在定义Weak时,您可以使用structclass

此外,为了帮助获取数组内容,您可以执行类似以下内容的操作:

代码语言:javascript
复制
extension Array where Element:Weak<AnyObject> {
  mutating func reap () {
    self = self.filter { nil != $0.value }
  }
}

上面对AnyObject的使用应该用T代替--但我不认为当前的Swift语言允许这样定义的扩展。

票数 172
EN

Stack Overflow用户

发布于 2020-03-16 22:38:07

函数式编程方法

不需要额外的类。

只需定义一个闭包数组() -> Foo?并使用[weak foo]将foo实例捕获为弱实例。

代码语言:javascript
复制
let foo = Foo()

var foos = [() -> Foo?]()
foos.append({ [weak foo] in return foo })

foos.forEach { $0()?.doSomething() }
票数 22
EN

Stack Overflow用户

发布于 2014-06-10 04:09:26

您可以通过创建包装对象来保存弱指针来实现此目的。

代码语言:javascript
复制
struct WeakThing<T: AnyObject> {
  weak var value: T?
  init (value: T) {
    self.value = value
  }
}

然后在数组中使用这些

代码语言:javascript
复制
var weakThings = WeakThing<Foo>[]()
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24127587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档