首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除数组中的元素而不对索引进行硬编码?在Swift中

删除数组中的元素而不对索引进行硬编码?在Swift中
EN

Stack Overflow用户
提问于 2014-07-15 00:41:29
回答 3查看 1.1K关注 0票数 3

这是我的第一篇文章,我很高兴能加入这个社区。我正在使用Ray Wenderlich的视频教程学习Swift。我在第3课遇到的挑战是在不对索引进行硬编码的情况下删除数组中的元素。我理解Ray提供的正确答案,但就是不明白为什么我的答案不起作用。请看下面Ray的回答和我的回答。如果有人能为我解释一下,那就太好了!谢谢:]

正确答案:

代码语言:javascript
复制
// Make an array with "C", "C++", and "Objective-C"
var programmingLanguages = ["C", "C++", "Objective-C"]

// Append "Swift" to the array
programmingLanguages += "Swift"

// Insert "Javascript" at Index 2
programmingLanguages.insert("Javscript", atIndex: 2)

// Remove "Objective-C" (without hard-coding the index)
let optIndex = find(programmingLanguages, "Objective-C")
if let defIndex = optIndex {
  programmingLanguages.removeAtIndex(defIndex)
}

programmingLanguages

我的answer1:

代码语言:javascript
复制
// Make an array with "C", "C++", and "Objective-C"
var programmingLanguages = ["C", "C++", "Objective-C"]

// Append "Swift" to the array
programmingLanguages += "Swift"

// Insert "Javascript" at Index 2
programmingLanguages.insert("Javscript", atIndex: 2)

// Remove "Objective-C" (without hard-coding the index)
programmingLanguages.removeAtIndex(find(programmingLanguages,"Objective-C")

programmingLanguages

我的answer2:

代码语言:javascript
复制
// Make an array with "C", "C++", and "Objective-C"
var programmingLanguages = ["C", "C++", "Objective-C"]

// Append "Swift" to the array
programmingLanguages += "Swift"

// Insert "Javascript" at Index 2
programmingLanguages.insert("Javscript", atIndex: 2)

// Remove "Objective-C" (without hard-coding the index)
let optIndex = find(programmingLanguages, "Objective-C")
programmingLanguages.removeAtIndex(optIndex)

programmingLanguages
EN

回答 3

Stack Overflow用户

发布于 2014-07-15 00:53:33

使用find()时,不能保证返回结果(这里会发生什么?:find(programmingLanguages, "rick astley"))

考虑到这种可能性,find()返回一个"optional“-这基本上意味着当它没有找到匹配时,它将返回nil

为了防止您在不知道如何处理的地方意外地使用nil,该语言将optionals视为一种不同的类型。简而言之,当你得到一个可选值时,你必须检查nil。

主要的方法是使用"if let“语法--如Ray的例子所示--但更简洁(也更常见)的方法如下:

代码语言:javascript
复制
if let defIndex = find(programmingLanguages, "Objective-C") {
  programmingLanguages.removeAtIndex(defIndex)
}

如果您确定optional不是nil (例如,如果您正在检查您刚刚插入的内容),则可以使用“强制展开”来获取optional中的值(如果optional为nil,则会导致错误和崩溃)。

可以使用强制展开运算符、感叹号!执行强制展开

代码语言:javascript
复制
// defIndex is an optional
let defIndex = find(programmingLanguages, "Objective-C")

// defIndex!  <-- unwraps the optional but raises an error if it's nil
programmingLanguages.removeAtIndex(defIndex!)
票数 7
EN

Stack Overflow用户

发布于 2014-07-15 00:52:36

您的答案不起作用,因为find返回一个可选值(类型为Int?而不是Int),主要是因为如果未找到该值,它将返回nil,如果找到该值,它将返回包装在可选值中的索引。然后,您的答案尝试将该可选值传递给removeAtIndex,它接受一个Int参数,而不是一个Int?

Ray的答案有条件地展开结果,并在尝试将其传递给removeAtIndex之前检查其有效性。

票数 0
EN

Stack Overflow用户

发布于 2014-07-15 06:39:21

虽然我认为Jiaaro简明扼要地解决了这个问题,但这里有一个我今天编写的函数,它做了类似的事情。我不知道find函数,虽然篇幅较长,但它很容易理解,可能会帮助您理解概念。

代码语言:javascript
复制
func arrayByRemovingObjectIdenticalTo<T: Equatable>(objectToRemove: T, fromArray:[T]) -> [T] {
    var returnArray = fromArray
    for (index, object) in enumerate(fromArray) {
        if object == objectToRemove {
            returnArray.removeAtIndex(index)
        }
    }

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

https://stackoverflow.com/questions/24741508

复制
相关文章

相似问题

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