我有一个NSMutable数组,它包含与键对应的内部数组,如下所示。
Array Sample:
{
Item = (
Studio,
"1 bed",
"2 bed",
"3 bed",
"4 bed",
"5+ bed",
"Individual Lease"
);
Status = (
None,
None,
None,
None,
None,
None,
None
);
},
{
Item = (
"1+ bath",
"2+ bath",
"3+ bath",
"4+ bath"
);
Status = (
None,
None,
None,
None
);
},
{
Item = (
"On Campus",
"Off Campus",
"Downtowm Lafayette",
Lafayette
);
Status = (
None,
None,
None,
None
);
}守则是:
var itemsArray = NSMutableArray()
var itemArr1:[String] = "Studio,1 bed,2 bed,3 bed,4 bed,5+ bed,Individual Lease".componentsSeparatedByCharactersInSet(NSCharacterSet (charactersInString: ","))
var statusArr1:[String] = "None,None,None,None,None,None,None".componentsSeparatedByCharactersInSet(NSCharacterSet (charactersInString: ","))
var itemArr2:[String] = "1+ bath,2+ bath,3+ bath,4+ bath".componentsSeparatedByCharactersInSet(NSCharacterSet (charactersInString: ","))
var statusArr2:[String] = "None,None,None,None".componentsSeparatedByCharactersInSet(NSCharacterSet (charactersInString: ","))
var itemArr3:[String] = "On Campus,Off Campus,Downtowm Lafayette,Lafayette".componentsSeparatedByCharactersInSet(NSCharacterSet (charactersInString: ","))
var statusArr3:[String] = "None,None,None,None".componentsSeparatedByCharactersInSet(NSCharacterSet (charactersInString: ","))
itemsArray.insertObject(["Item": itemArr1, "Status": statusArr1], atIndex: 0)
itemsArray.insertObject(["Item": itemArr2, "Status": statusArr2], atIndex: 1)
itemsArray.insertObject(["Item": itemArr3, "Status": statusArr3], atIndex: 2)
println("\(itemsArray)")
itemsArray.objectAtIndex(0).valueForKey("Item").replaceObjectAtIndex(0, withObject: "ReplaceValue")现在,当我要替换任何索引状态或类似键数组值时,它就崩溃了。简而言之,我需要替换嵌套数组的任何索引的值。同样的模式在目标c中很好。如果你对这些类型有任何想法或代码,那么请帮助我。你的帮助将是令人钦佩的。提前谢谢。
发布于 2014-12-02 07:13:37
我怀疑这里的问题是将本机Swift类型与Objective类型混合的方式。如果代码确实反映了所需的数据结构,那么为什么不使用所有本机Swift类型呢?然后,你想要做的事情变得非常简单:
var itemsArray = [Dictionary<String, [String]>]()
var itemArr1: [String] = "Studio,1 bed,2 bed,3 bed,4 bed,5+ bed,Individual Lease".componentsSeparatedByString(",")
var statusArr1: [String] = "None,None,None,None,None,None,None".componentsSeparatedByString(",")
var itemArr2: [String] = "1+ bath,2+ bath,3+ bath,4+ bath".componentsSeparatedByString(",")
var statusArr2: [String] = "None,None,None,None".componentsSeparatedByString(",")
var itemArr3: [String] = "On Campus,Off Campus,Downtowm Lafayette,Lafayette".componentsSeparatedByString(",")
var statusArr3: [String] = "None,None,None,None".componentsSeparatedByString(",")
itemsArray.append(["Item": itemArr1, "Status": statusArr1])
itemsArray.append(["Item": itemArr2, "Status": statusArr2])
itemsArray.append(["Item": itemArr3, "Status": statusArr3])
println("\(itemsArray)")
itemsArray[0]["Item"]![0] = "ReplaceValue"itemsArray现在是一个完全原生的Swift数据结构--一个字典数组,每个字典都将一个字符串映射到一个字符串数组。若要更改值,只需赋值即可。
更新
至于您的代码不起作用的具体原因,我得承认,我觉得它有点模糊。让我们再看一遍失败的行:
itemsArray.objectAtIndex(0).valueForKey("Item").replaceObjectAtIndex(0, withObject: "ReplaceValue")在这里,它按每个调用进行细分,显示每个调用返回的类型:
itemsArray // NSMutableArray
.objectAtIndex(0) // AnyObject
.valueForKey("Item") // AnyObject
.replaceObjectAtIndex(0, withObject: "ReplaceValue") // Blows up有趣的是Swift隐式地降低AnyObjects的方式。回想一下NSArray/etc/etc的内容是非类型化的,因此访问它们会返回一个泛型的AnyObject,您可以尝试将其向下转换为更特定的类型。
在第一种情况下,Swift将自动为您处理这一问题,将ObjectAtIndex返回的ObjectAtIndex降为NSDictionary,以便在其上调用valueForKey。
但是,在第二种情况下,它不愿意将AnyObject降为NSMutableArray,以便您可以调用replaceObjectAtIndex。为什么这两种情况有区别?
我没有把握。但似乎斯威夫特不愿意从他们的斯威夫特收集的目标C的Mutable风格。您在本例中提供的对象是一个Swift数组(确切地说,是一个Array<String> )。尽管这个对象被声明为var,但是Swift拒绝允许对象从Array<String>到AnyObject再到NSMutableArray。
通过尝试以下方法,您可以轻松地看到这一点:
var test_array = ["hello", "there"]
(test_array as AnyObject) as NSArray // works
(test_array as AnyObject) as NSMutableArray // blows up对我来说,这个故事的寓意是不要使用Swift的NS集合类型,除非你必须这样做。当您在Swift代码中使用它们时,请确保您知道进出它们的对象的类型,并注意Swift在试图消除本地Swift集合类型与它们的目标-C对应项之间的区别时是否很友好。
发布于 2014-12-02 17:08:55
所以它崩溃的原因是您试图在Swift数组上调用replaceObjectAtIndex,而不是NSMutableArray。
在println("\(itemsArray)")之后添加此代码
let isArray = itemsArray.objectAtIndex(0).valueForKey("Item") is Array<String>
let isMutableArray = itemsArray.objectAtIndex(0).valueForKey("Item") is NSMutableArray
println("Results \(isArray) and \(isMutableArray)")并且您应该看到输出“结果正确和错误”。
Todd的代码之所以工作,是因为他将代码转换为使用了所有Swift数据类型,而编译器可以推断出所有的类型。为了让您的代码工作,您还需要正确地键入强制转换组件使用?或者让。
作为一个建议,当您正在学习Swift时,您可能不想构建这些更长的链式语句,而是将它们分解。这是更多的代码,然而,它将增加更清晰的学习,因为您将更好地理解每个部分做什么。
https://stackoverflow.com/questions/27242950
复制相似问题