gpt4 book ai didi

swift - 使用 List 快速进行本地迁移

转载 作者:行者123 更新时间:2023-12-04 08:54:49 25 4
gpt4 key购买 nike

使用 Realm 5.4.0 我正在尝试迁移:

public final class MyObject: Object {
public let tags = List<String>()
}

public final class MyObject: Object {
public let tagIds = List<String>()
}
因此我想写一个这样的迁移块:
migration.enumerateObjects(ofType: "MyObject") { oldObject, newObject in
let tags = [String: String]() // filled earlier
let oldTagList = oldObject!.dynamicList("tags")
let newTagList = newObject!.dynamicList("tagIds")

oldTagList.forEach { tag in
if let id = tags[tag as String] { // this does not compile (1)
newTagList.append(id) // this does not work (2)
}
}
}
从 oldTagList 我得到不能转换为字符串的 DynamicObjects (1)。我能够通过一个非常丑陋的解决方法解决这个问题:
let oldTagList = unsafeBitCast(oldObject!["tags"] as! List<DynamicObject>, to: List<String>.self)
我无法解决的是添加 id字符串到新对象 tagIds list (2)。
我试图以与 oldObjects 相同的方式转换列表 tags列表但会抛出 EXC_BAD_ACCESS错误。
如何迁移/转换 List<String> 的内容进入另一个 List<String> ?

最佳答案

问题中的目标是创建一个新标签 List对于基于字典查找具有不同标签的更新对象。为了清楚起见,让我设置一下
这是带有标签 List 的现有对象(字符串)

object_0
tags = ["a", "b", "c"]
新对象将如下所示
object_0
tagIds = ["tag_a", "tag_b", "tag_c"]
查找是通过现有的字典完成的,看起来像这样
tags ["a": "tag_a",
"b": "tag_b",
"c": "tag_c"]
所以a映射到tag_a,b映射到tag_b等
这是执行此操作的迁移块
migration.enumerateObjects(ofType: MyObject.className()) { oldItem, newItem in
let oldTags = oldItem!["tags"] as! List<MigrationObject>
let tagCount = oldTags.count

let updatedList = List<String>()

for index in 0..<tagCount {
let oldTag = oldTags[index]
let val = "\(oldTag)" //make the NSTaggedPointerString a String
//let val = oldTag.description this may work as well

if let updatedTag = self.tags[val] {
updatedList.append(updatedTag)
}
}

newItem!["tagIds"] = updatedList
}

关于swift - 使用 List<String> 快速进行本地迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63887626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com