首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSMutable数组中替换值的几个问题

NSMutable数组中替换值的几个问题
EN

Stack Overflow用户
提问于 2014-12-02 06:09:59
回答 2查看 5.8K关注 0票数 0

我有一个NSMutable数组,它包含与键对应的内部数组,如下所示。

代码语言:javascript
运行
复制
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
    );
}

守则是:

代码语言:javascript
运行
复制
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中很好。如果你对这些类型有任何想法或代码,那么请帮助我。你的帮助将是令人钦佩的。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-02 07:13:37

我怀疑这里的问题是将本机Swift类型与Objective类型混合的方式。如果代码确实反映了所需的数据结构,那么为什么不使用所有本机Swift类型呢?然后,你想要做的事情变得非常简单:

代码语言:javascript
运行
复制
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数据结构--一个字典数组,每个字典都将一个字符串映射到一个字符串数组。若要更改值,只需赋值即可。

更新

至于您的代码不起作用的具体原因,我得承认,我觉得它有点模糊。让我们再看一遍失败的行:

代码语言:javascript
运行
复制
itemsArray.objectAtIndex(0).valueForKey("Item").replaceObjectAtIndex(0, withObject: "ReplaceValue")

在这里,它按每个调用进行细分,显示每个调用返回的类型:

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
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对应项之间的区别时是否很友好。

票数 2
EN

Stack Overflow用户

发布于 2014-12-02 17:08:55

所以它崩溃的原因是您试图在Swift数组上调用replaceObjectAtIndex,而不是NSMutableArray。

println("\(itemsArray)")之后添加此代码

代码语言:javascript
运行
复制
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时,您可能不想构建这些更长的链式语句,而是将它们分解。这是更多的代码,然而,它将增加更清晰的学习,因为您将更好地理解每个部分做什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27242950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档