Ios 删除数组中的元素而不硬编码索引?迅速地
这是我的第一篇帖子,我很高兴加入这个社区。我正在通过Ray Wenderlich的视频教程学习Swift。我在第3课中遇到的挑战是在不硬编码索引的情况下删除数组中的元素。我理解Ray提供的正确答案,但就是不明白为什么我的答案不起作用。请看下面雷的答案以及我的答案。如果有人能为我解释一下,那就太好了!!谢谢:] 正确答案:Ios 删除数组中的元素而不硬编码索引?迅速地,ios,swift,Ios,Swift,这是我的第一篇帖子,我很高兴加入这个社区。我正在通过Ray Wenderlich的视频教程学习Swift。我在第3课中遇到的挑战是在不硬编码索引的情况下删除数组中的元素。我理解Ray提供的正确答案,但就是不明白为什么我的答案不起作用。请看下面雷的答案以及我的答案。如果有人能为我解释一下,那就太好了!!谢谢:] 正确答案: // Make an array with "C", "C++", and "Objective-C" var programmingLanguages = ["C", "C+
// 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返回一个可选值(类型是
Int?
而不是Int
),主要是因为如果没有找到该值,它将返回nil
,如果找到该值,它将返回以可选值包装的索引。然后,您的答案尝试将该可选值传递给removateIndex
,该值采用Int
参数,而不是Int?
Ray的回答有条件地打开结果并检查其有效性,然后再尝试将其传递给removeAtIndex。当您使用find()
时,不保证返回结果(这里会发生什么?:find(programmingLanguages,“rick astley”)
)
为了解释这种可能性,find()
返回一个“”-这基本上只是意味着当它找不到匹配项时,它将返回nil
为了防止您在不知道如何处理的地方意外使用nil
,该语言将optionals视为一种独特的类型。简而言之,当您获得可选值时,必须检查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!)
//defIndex是可选的
让defIndex=find(编程语言,“Objective-C”)
//defIndex 虽然我认为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
}
func arrayByRemovingObjectIdenticalTo(objectToRemove:T,fromArray:[T])->[T]{
var returnArray=fromArray
用于枚举(fromArray)中的(索引,对象){
如果对象==objectToRemove{
returnArray.removeAtIndex(索引)
}
}
返回数组
}
谢谢你,佳亚罗!那很有帮助!