在更改NSMutableDictioanary

时间:2017-05-17 10:28:35

标签: ios swift3 nsarray nsdictionary

我需要在Swift 3.0中的NSArray中使用NSMutableDictionary帮助。 结构是一个字典数组

这是我的代码

class abc{
    var myTempArr : NSArray! 
 }

  // I need objC variables as I need to pass them as reference

 someMethod(){
    myTempArr = [["title":"abc","id":"1"]] // creating a dictionary inside the array
   // I have changed the value like this also, but the crash remains
   // [["title":"abc","id":"1"] as! NSMutableDictionary]


 }


// This method is called in every key stroke in keyboard. Lets say we replace the "title", with the letter in the keyboard it is tapped

 func someotherMethod(){
      let firstDictionary = myTempArr[0] as! NSMutableDictionary
      // Its crashing here!!!!
      // Again i need nsmutabledictionary as i need to change the value
      // inside the dictionary so that the value inside the main array
      // that is myTempArr also changes. I need a pass by reference
      // method, hence i choosed NSMutableDictionary instead of swift dictionary

      firstDictionary["title"] = "New Title"
      // After this line, the original dictionary inside myTempArr
      // should change as well. But its crashing in the mentioned line

 }

我不想使用类实例,因为我知道它们也通过引用传递但我需要应用Predicate来查找数组中的正确字典,而不是按索引搜索。这也是我无法理解的概念。请帮我解决这个问题。

崩溃说:

  

无法转换类型' Swift._SwiftDeferredNSDictionary'       (0x7facdb71e6c0)到' NSMutableDictionary' (0x102bfa350)。

[编辑]

许多人建议选择在变量中获取Dictionary,更改变量然后替换数组中的字典。那么我想避免这种方法,因为这与使用基于值的解决方案(Swift Dictionary,其中传递的值)相同。我想避免这种情况的原因是因为,我使用的原始DS有大量的字典,字典的值经常变化。因此我不认为使用替换字典方法会是合理的。

我也知道swift这不好,因为swift不是为此设计的。这种方法在Objective C中完全正常,因为我们更改变量(提示:变量的指针),更改它最初的变量。 如果有人可以在Swift中建议一个替代或好的方法,那么请它会很棒。

同样为了简单起见,我使用的索引为0.因为只有1个字典。但是在最初的DS中,我提到了很多字典,因此我使用了谓词。这也是我没有使用类的实例(也在swift中通过引用传递)的原因,因为我不知道当我们通过谓词搜索它们时类的实例是否像字典一样。

非常欢迎任何解决方案或替代方案。一如既往地感谢各位给我时间,因为我正在努力探讨如何采用新方法

5 个答案:

答案 0 :(得分:0)

试试这个

var yay = $('textarea').val().split(/[\ \n\r\;\:\,]+/).length;
alert(yay);

答案 1 :(得分:0)

因为那个字典不可变。你不能这样投。 你可能想做这样的事情:

编辑:好的,这应该对你有用:

var tempArray: Array<Dictionary<String,String>>!

...初始化

tempArray = [["title":"abc","id":"1"]] 

并像这样编辑字典:

func someotherMethod(){ 
     tempArray[0]["title"] = "New Title" 
}

编辑: 我不知道 - 听你的评论,也许这样的话会对你有用吗?

关于获取正确字典的问题:

DOUBLE EDIT:

if let dictionaryIndex = tempArray.index(where: {$0["title"] == "abc"}) {
        tempArray[dictionaryIndex]["title"] = "NOT ABC"
}

新兴都市。您可以使用== check获得所需的确切字典,并更改确切的可变tempArray值。

答案 2 :(得分:0)

您可以通过以下方式定义myTempArr:

AttributeError: read

答案 3 :(得分:0)

导致代码崩溃的原因是NSArray,需要更改为NSMutableArray,因为下标不支持NSArray的Mutable行为。

检查以下代码,并在代码内部进行更改:

var myTempArr: NSMutableArray = [["title":"abc","id":"1"]] //Should be mutable for updating information
let dictionary = myTempArr[0] as? NSMutableDictionary ?? [:] //Getting here dictionay(Key value here)
dictionary["title"] = "New Title"  //Changing here value
myTempArr[0] = dictionary  //Finally updating on main array details

否则,可以尝试以下代码: -

var array = [["title":"abc","id":"1"]] //Mutable Array
var dictionary = myTempArr[0] as? [String: String] ?? [:] //Getting here values
dictionary["title"] = "New Title" //Changing value
myTempArr[0] = dictionary // Updating Main array value

代码输出: -

Output

答案 4 :(得分:0)

我建议字典可能是存储在数组中的错误数据结构。您已指出字典代表某种表单字段。您可以创建一个对象来为这些字段建模,然后在使用不可变数组的同时利用对象的可变性。

类似的东西:

class Field {

    let id: Int
    let name: String
    var value: String

    init(id: Int, name: String, value: String = "") {
        self.id = id
        self.name = name
        self.value = value
    }

}

let firstNameField = Field(id:1, name:"FirstName")
let surnameField = Field(id:2, name:"Surname")

firstNameField.value = "Paul"

var fieldsArray = [firstNameField,surnameField]

firstNameField.value = "Peter"

print(fieldsArray[0].value)  // Prints Peter

if let field1 = fieldsArray.first(where:{ $0.id == 1} ) {    
    print(field1.value)  // Prints Peter
    field1.value = "John"
}

print(fieldsArray[0].value)  // Prints John

请注意,由于Field是一个类,我们能够使用引用语义,并且永远不必改变数组,因此数组上的修改操作没有副本。