这是我的第一篇文章,我很高兴加入这个社区。我正和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
答案 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
}