swift - 使参与者符合序列协议
问题描述
如何使参与者符合Sequence
协议?以下代码生成编译器警告:
与全局角色“MainActor”隔离的实例方法“makeIterator()”无法满足协议“序列”的相应要求
@MainActor class Test: Sequence {
private var contents: [Int] = []
func makeIterator() -> Array<Int>.Iterator {
contents.makeIterator()
}
}
解决方案
将全局参与者(如@MainActor
)应用于类型声明会@MainActor
在该类型的属性和方法中添加一个隐式。
这意味着您的示例等效于:
class Test: Sequence {
@MainActor private var contents: [Int] = []
@MainActor
func makeIterator() -> Array<Int>.Iterator {
contents.makeIterator()
}
}
这是一个问题,因为Sequence
有一个makeIterator
不孤立于特定全局参与者的要求。如果是这种情况,您将无法Array
在后台线程中使用 for 循环。因此,要退出隐式隔离,您可以编写:
@MainActor class Test: Sequence {
private var contents: [Int] = []
nonisolated func makeIterator() -> Array<Int>.Iterator {
// You can't use the isolated property 'contents'
// here, because it's isolated
}
}
也许您打算Test
遵循一个类似Sequence
的协议,其要求与@MainActor
. 不幸的是,仅提出了类似的功能作为未来的方向。
如果您仍然感到困惑,那么值得退后一步,考虑一下您真正想要实现的目标。Actor 隔离提供了一种安全地改变跨线程共享的数据的方法。因此,没有隔离意味着缺乏突变(因此能够标记let
属性nonisolated
)或除了参与者之外的同步机制。
推荐阅读
- r - 为什么 R 中的 welch 测试函数(包 onewaytests)不接受“因子”类型的样本值?
- python - 使用 seaborn、pandas 和 datetime 的错误每月线图
- django - 使用自定义模板标签突出显示搜索结果
- android - 嵌套滚动视图中的 ESRI 映射
- c# - 如何使用本机(非 ASP)HTML 标记发送多个选择列表选项?
- python - Python TEXT 到 HEX 字节字符串
- google-apps-script - 从谷歌驱动器中可用的所有工作表中复制特定单元格值并使用应用程序脚本粘贴到主工作表中
- reactjs - 即使需要 ID 属性,如何处理未保存的实体?
- python - 可以在 s3(csv 文件) 之间创建一个 worflow(airflow) 以将其存储在 mongodb 中吗?
- android - 使用 axway appcelerator Webview 如何将文件下载到设备