删除数组中的元素而不对索引进行硬编码?在斯威夫特

时间:2014-07-14 16:41:29

标签: ios swift

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

正确答案:

// 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

我的回答1:

// 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

我的回答2:

// 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

3 个答案:

答案 0 :(得分:7)

当您使用find()时,无法保证返回结果(此处会发生什么?:find(programmingLanguages, "rick astley")

为了解释这种可能性,find()会返回“optional” - 这基本上只是意味着当找不到匹配时它会返回nil

为了防止您在某些不知道如何处理它的地方意外使用nil,该语言会将选项视为一种独特的类型。简而言之,当您获得可选值时,必须检查nil。

执行此操作的主要方法是使用“if let”语法 - 如Ray的示例所示 - 但更简洁(也更常见)的方法就是这样:

if let defIndex = find(programmingLanguages, "Objective-C") {
  programmingLanguages.removeAtIndex(defIndex)
}

如果您确定可选项不是nil(就像您正在检查只是插入的内容一样),您可以使用“强制解包”来获取值可选的(如果它是nil会导致错误和崩溃。)

您使用强制解包操作符强制解包,感叹号!

// 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!)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

虽然我认为Jiaaro指出它简洁明了,但我今天写的这个函数做了类似的事情。我不知道find函数,虽然时间更长,但很容易理解,可能会帮助你理解这个概念。

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
}