首页 > 解决方案 > RealmSwift 上的问题:“无效的数组输入:值 (1) 多于属性 (0)。” 在尝试持久化字符串数组时

问题描述

我试图坚持一个表格视图单元格,这是一个带有问题的测验测试的结果,我需要给出的答案数组(字符串数组)所以我决定使用 RealmSwift。

我创建了这个类,当然我还在同一个文件中创建了一个 RealmString 对象,以处理以这种方式在 Realm 中持久化 String 数组的可能性:


class RealmString: Object {
    dynamic var stringValue = ""
}

class Test: Object {
    
    @objc dynamic var ID = UUID().uuidString
    @objc dynamic var testScore : String = String()
    
    @objc dynamic var testTitle : String = String()
    @objc dynamic var testSubTitle : String = String()
    
    @objc dynamic var dateOfExecution: String = String()
    
    @objc dynamic var answersGiven: [String] {
            
            get {
                return _backingAnswersGiven.map { $0.stringValue }
            }
            set {
                _backingAnswersGiven.removeAll()
                _backingAnswersGiven.append(objectsIn: (newValue.map({ RealmString(value: [$0]) })))
          }
       
            
    }
    
    let _backingAnswersGiven = List<RealmString>()
    
    override static func ignoredProperties() -> [String] {
           return ["answersGiven"]
    }
    
    
    override static func primaryKey() -> String? {
        return "ID"
    }
    

现在在视图控制器中:

我有一个存储结果的变量(是一个 Int 数组,它将接受十个答案,其值从 0 到 5,稍后将转换为字符串),即:[0,2,2,3,4,5,2 ,1,0,2] -> ["0","2","2","3","4","5","2","1","0","2"]

当在问题中选择一个选项时,使用此功能设置值,一切正常。

public var questionResults: [Int] = []

func setValueToQuestion(questionNumber: Int) {
   questionResults[questionNumber] = optionChosen
}

测试成功完成后,所有内容都以这种方式保存:

  let test = Test()
  test.ID = currentTest?.ID ?? UUID().uuidString
  test.testTitle = testTitleLabel.text!
  test.testScore = resultNumberLabel.text!
  test.testSubTitle = resultLabel.text! 
  test.dateOfExecution = dateTimeString
  test.answersGiven = questionResults.map({String($0)})
       
  DBManager.sharedInstance.addData(object: test)
    

我单独尝试了代码,还添加了断点,一切都在流程中运行,期待这一行:

test.answersGiven = questionResults.map({String($0)})

这会引发标题中显示的错误:“无效的数组输入:值 (1) 多于属性 (0)。”

我想这可能是映射错误?

然后在流程的其余部分中将此值视为 String = [String] 的简单快速数组

标签: arraysswiftxcoderealm

解决方案


有几个问题可能会导致该错误。

首先 RealmString 属性没有被持久化,因为它需要@objc

dynamic var stringValue = ""

应该

@objc dynamic var stringValue = ""

其次,这很重要,Realm 不支持 Lists 中的原语。嗯,它有点,但不是很好。

编辑: 10.7 版增加了对过滤器/查询以及原语上的聚合函数的支持,因此以下信息不再完全有效。但是,仍然需要注意。

请参阅我对这个问题的回答,但简而言之,您需要另一个类来存储字符串 - 有点像您的 RealmString 类。

class StringClass: Object {
    @objc dynamic var myString = ""
}

然后将 Test 对象属性更改为使用 StringClass 属性

@objc dynamic var answersGiven = [StringClass]()

然后我看到您正在尝试使用支持的 var 和计算属性,但我不知道为什么。使用 var 本身可能更简单

let _backingAnswersGiven = List<RealmString>()

因为 List 集合已经处理了正在计算的内容。

例如,如果您设置列表,您可以将其设置为另一个列表(这会清除当前列表)。或者,当您获取 list 时let myStringList = test._backingAnswersGiven,获取列表中的所有 StringClasses,而无需对它们进行 .map 映射。


推荐阅读