更改 NSMutableDictioanary 的值时崩溃
Crash while changing value of a NSMutableDictioanary
我需要一些关于 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
}
我不想使用 class 实例,因为我知道它们也是通过引用传递的,但我需要应用 Predicate 在数组中查找正确的字典,而不是通过索引搜索。这也是我无法理解的概念。请帮我解决这个问题。
崩溃说:
Could not cast value of type 'Swift._SwiftDeferredNSDictionary'
(0x7facdb71e6c0) to 'NSMutableDictionary' (0x102bfa350).
[编辑]
正如许多人建议的那样,将字典放入变量中,更改变量,然后替换数组中的字典。好吧,我想避免这种方法,因为这与使用基于值的解决方案(Swift 字典,其中按值传递)相同。我想避免这种情况的原因是,我使用的原始 DS 有大量的字典,而且字典的值经常变化。因此,我不认为使用替换字典的方法是合理的。
而且我知道在 swift 这不是很好,因为 swift 不是为此设计的。这种方法在 Objective C 中工作得很好,因为我们改变变量(提示:变量指针),改变它最初来自的变量。
如果有人可以在 Swift 中提出替代方法或好的方法,那就太棒了。
同样为了简单起见,我使用了索引 0。因为只有 1 个字典。但是在最初的 DS 中,正如我提到的那样有很多字典,因此我使用谓词。这也是为什么我没有使用 class 的实例(在 swift 中也通过引用传递)的原因,因为我不知道 class 的实例在我们搜索它们时是否表现得像字典谓词.
非常欢迎任何解决方案或替代方案。一如既往地感谢你们给我时间,因为我正在努力思考如何采用新方法
试试这个
let firstDictionary = NSMutableDictionary(dictionary: myTempArr[0])
因为那个字典是不可变的。你不能这样投它。
你可能想做这样的事情:
编辑:好的,这应该对你有用:
var tempArray: Array<Dictionary<String,String>>!
初始化...
tempArray = [["title":"abc","id":"1"]]
然后像这样编辑字典:
func someotherMethod(){
tempArray[0]["title"] = "New Title"
}
编辑:
我不知道 - 听了您的评论,也许这样的东西对您有用?
关于您关于获取正确词典的问题:
双重编辑:
if let dictionaryIndex = tempArray.index(where: {[=13=]["title"] == "abc"}) {
tempArray[dictionaryIndex]["title"] = "NOT ABC"
}
新兴城市。您可以通过 == 检查获得所需的确切字典,然后更改确切的可变 tempArray 值。
您可以这样定义 myTempArr:
func someMethod(){
let nsmutabledict = NSMutableDictionary(dictionary: ["title":"abc","id":"1"])
myTempArr = [nsmutabledict]
}
导致代码崩溃的原因是 NSArray
,需要更改为 NSMutableArray
,因为下标不支持 NSArray
的可变行为。
检查下面的代码并在代码运行后对代码进行更改:-
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
代码输出:-
我建议字典可能是存储在数组中的错误数据结构。您已经指出字典代表某种形式的字段。您可以创建一个对象来为这些字段建模,然后在仍然使用不可变数组的同时利用对象的可变性。
类似于:
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:{ [=10=].id == 1} ) {
print(field1.value) // Prints Peter
field1.value = "John"
}
print(fieldsArray[0].value) // Prints John
请注意,由于 Field
是一个 class,我们能够使用引用语义,而不必改变数组,因此数组上的修改操作没有复制。
我需要一些关于 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
}
我不想使用 class 实例,因为我知道它们也是通过引用传递的,但我需要应用 Predicate 在数组中查找正确的字典,而不是通过索引搜索。这也是我无法理解的概念。请帮我解决这个问题。
崩溃说:
Could not cast value of type 'Swift._SwiftDeferredNSDictionary' (0x7facdb71e6c0) to 'NSMutableDictionary' (0x102bfa350).
[编辑]
正如许多人建议的那样,将字典放入变量中,更改变量,然后替换数组中的字典。好吧,我想避免这种方法,因为这与使用基于值的解决方案(Swift 字典,其中按值传递)相同。我想避免这种情况的原因是,我使用的原始 DS 有大量的字典,而且字典的值经常变化。因此,我不认为使用替换字典的方法是合理的。
而且我知道在 swift 这不是很好,因为 swift 不是为此设计的。这种方法在 Objective C 中工作得很好,因为我们改变变量(提示:变量指针),改变它最初来自的变量。 如果有人可以在 Swift 中提出替代方法或好的方法,那就太棒了。
同样为了简单起见,我使用了索引 0。因为只有 1 个字典。但是在最初的 DS 中,正如我提到的那样有很多字典,因此我使用谓词。这也是为什么我没有使用 class 的实例(在 swift 中也通过引用传递)的原因,因为我不知道 class 的实例在我们搜索它们时是否表现得像字典谓词.
非常欢迎任何解决方案或替代方案。一如既往地感谢你们给我时间,因为我正在努力思考如何采用新方法
试试这个
let firstDictionary = NSMutableDictionary(dictionary: myTempArr[0])
因为那个字典是不可变的。你不能这样投它。 你可能想做这样的事情:
编辑:好的,这应该对你有用:
var tempArray: Array<Dictionary<String,String>>!
初始化...
tempArray = [["title":"abc","id":"1"]]
然后像这样编辑字典:
func someotherMethod(){
tempArray[0]["title"] = "New Title"
}
编辑: 我不知道 - 听了您的评论,也许这样的东西对您有用?
关于您关于获取正确词典的问题:
双重编辑:
if let dictionaryIndex = tempArray.index(where: {[=13=]["title"] == "abc"}) {
tempArray[dictionaryIndex]["title"] = "NOT ABC"
}
新兴城市。您可以通过 == 检查获得所需的确切字典,然后更改确切的可变 tempArray 值。
您可以这样定义 myTempArr:
func someMethod(){
let nsmutabledict = NSMutableDictionary(dictionary: ["title":"abc","id":"1"])
myTempArr = [nsmutabledict]
}
导致代码崩溃的原因是 NSArray
,需要更改为 NSMutableArray
,因为下标不支持 NSArray
的可变行为。
检查下面的代码并在代码运行后对代码进行更改:-
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
代码输出:-
我建议字典可能是存储在数组中的错误数据结构。您已经指出字典代表某种形式的字段。您可以创建一个对象来为这些字段建模,然后在仍然使用不可变数组的同时利用对象的可变性。
类似于:
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:{ [=10=].id == 1} ) {
print(field1.value) // Prints Peter
field1.value = "John"
}
print(fieldsArray[0].value) // Prints John
请注意,由于 Field
是一个 class,我们能够使用引用语义,而不必改变数组,因此数组上的修改操作没有复制。