这是我的第一篇文章,我很高兴能加入这个社区。我正在使用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我的answer1:
// 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:
// 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发布于 2014-07-15 00:53:33
使用find()时,不能保证返回结果(这里会发生什么?:find(programmingLanguages, "rick astley"))
考虑到这种可能性,find()返回一个"optional“-这基本上意味着当它没有找到匹配时,它将返回nil。
为了防止您在不知道如何处理的地方意外地使用nil,该语言将optionals视为一种不同的类型。简而言之,当你得到一个可选值时,你必须检查nil。
主要的方法是使用"if let“语法--如Ray的例子所示--但更简洁(也更常见)的方法如下:
if let defIndex = find(programmingLanguages, "Objective-C") {
programmingLanguages.removeAtIndex(defIndex)
}如果您确定optional不是nil (例如,如果您正在检查您刚刚插入的内容),则可以使用“强制展开”来获取optional中的值(如果optional为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!)发布于 2014-07-15 00:52:36
您的答案不起作用,因为find返回一个可选值(类型为Int?而不是Int),主要是因为如果未找到该值,它将返回nil,如果找到该值,它将返回包装在可选值中的索引。然后,您的答案尝试将该可选值传递给removeAtIndex,它接受一个Int参数,而不是一个Int?。
Ray的答案有条件地展开结果,并在尝试将其传递给removeAtIndex之前检查其有效性。
发布于 2014-07-15 06:39:21
虽然我认为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
}https://stackoverflow.com/questions/24741508
复制相似问题