Ios 删除数组中的元素而不硬编码索引?迅速地

Ios 删除数组中的元素而不硬编码索引?迅速地,ios,swift,Ios,Swift,这是我的第一篇帖子,我很高兴加入这个社区。我正在通过Ray Wenderlich的视频教程学习Swift。我在第3课中遇到的挑战是在不硬编码索引的情况下删除数组中的元素。我理解Ray提供的正确答案,但就是不明白为什么我的答案不起作用。请看下面雷的答案以及我的答案。如果有人能为我解释一下,那就太好了!!谢谢:] 正确答案: // Make an array with "C", "C++", and "Objective-C" var programmingLanguages = ["C", "C+

这是我的第一篇帖子,我很高兴加入这个社区。我正在通过Ray Wenderlich的视频教程学习Swift。我在第3课中遇到的挑战是在不硬编码索引的情况下删除数组中的元素。我理解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返回一个可选值(类型是
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(索引)
}
}
返回数组
}

谢谢你,佳亚罗!那很有帮助!