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

这是我的第一篇文章,我很高兴加入这个社区。 我正和Ray Wenderlich的video教程学习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 

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

为了解释这种可能性, find()返回一个“ 可选 ” – 这基本上只是意味着当它找不到匹配时它将返回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!) 

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

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

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

 func arrayByRemovingObjectIdenticalTo(objectToRemove: T, fromArray:[T]) -> [T] { var returnArray = fromArray for (index, object) in enumerate(fromArray) { if object == objectToRemove { returnArray.removeAtIndex(index) } } return returnArray }