在swift中替换NSMutableArray中的值的问题

时间:2014-12-02 06:09:59

标签: swift nsmutablearray

我在swift中有一个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中很好用。如果您对这些类型有任何想法或代码,请帮助我。 你的帮助将是令人钦佩的。 非常感谢提前。

2 个答案:

答案 0 :(得分:2)

我怀疑这里的问题是你将Native Swift类型与Objective-C类型混合的方式。如果您的代码真的反映了您想要的数据结构,为什么不使用所有原生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 / NSDictionary / etc的内容是非类型的,因此访问它们会返回一个通用的AnyObject,您可以尝试向下转换为更具体的类型。

在第一种情况下,Swift会自动为您处理此问题,将AnyObject返回的ObjectAtIndex向下转换为NSDictionary,以便您可以在其上调用valueForKey。< / p>

然而,在第二种情况下,它不愿意将AnyObject转发为NSMutableArray,因此您可以致电replaceObjectAtIndex。为什么这两种情况有区别?

我不确定。但似乎Swift不愿意从他们的Swift同行那里贬低Objective-C系列的Mutable风格。在这种情况下,您提供的对象是Swift数组(准确地说是Array<String>)。即使此对象声明为var,Swift也拒绝允许对象从Array<String>转到AnyObjectNSMutableArray

通过尝试以下方法,您可以轻松地看到这一点:

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集合类型与Objective-C对应物之间的区别。

答案 1 :(得分:0)

为什么崩溃是因为你试图在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)")

你应该看到输出&#34;结果是真和假&#34;

Todd Agulnick的代码之所以有用,是因为他将其转换为使用所有Swift数据类型并且编译器可以推断出所有类型。为了使您的代码有效,您还需要使用as正确键入转换组件?或者让。

作为一个建议,当你学习Swift时,你可能想要不构建这些更长链接的语句,而是将它们分解。这是更多的代码,但是,随着您的学习,它将增加更多的清晰度,因为您将更好地理解每个部分的作用。