为了账号安全,请及时绑定邮箱和手机立即绑定

通过可选绑定在Swift中进行安全(边界检查)数组查找?

/ 猿问

通过可选绑定在Swift中进行安全(边界检查)数组查找?

慕婉清6462132 2019-08-09 15:45:41

通过可选绑定在Swift中进行安全(边界检查)数组查找?

如果我在Swift中有一个数组,并尝试访问超出范围的索引,则会出现一个不足为奇的运行时错误:

var str = ["Apple", "Banana", "Coconut"]str[0] // "Apple"str[3] // EXC_BAD_INSTRUCTION

但是,我会想到Swift带来的所有可选链接和安全性,这样做会很简单:

let theIndex = 3if let nonexistent = str[theIndex] { // Bounds check + Lookup    print(nonexistent)
    ...do other things with nonexistent...}

代替:

let theIndex = 3if (theIndex < str.count) {         // Bounds check    let nonexistent = str[theIndex] // Lookup    print(nonexistent)   
    ...do other things with nonexistent... }

但事实并非如此 - 我必须使用ol' if语句来检查并确保索引小于str.count

我尝试添加自己的subscript()实现,但我不知道如何将调用传递给原始实现,或者不使用下标符号来访问项目(基于索引):

extension Array {
    subscript(var index: Int) -> AnyObject? {
        if index >= self.count {
            NSLog("Womp!")
            return nil
        }
        return ... // What?    }}


查看完整描述

3 回答

?
莫回无

我偶然发现了一种更好的实现此功能的方法:

Swift 3.2和更新版本

extension Collection {

    /// Returns the element at the specified index if it is within bounds, otherwise nil.    subscript (safe index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }}

Swift 3.0和3.1

extension Collection where Indices.Iterator.Element == Index {

    /// Returns the element at the specified index if it is within bounds, otherwise nil.    subscript (safe index: Index) -> Generator.Element? {
        return indices.contains(index) ? self[index] : nil
    }}

斯威夫特2

extension CollectionType {

    /// Returns the element at the specified index if it is within bounds, otherwise nil.    subscript (safe index: Index) -> Generator.Element? {
        return indices.contains(index) ? self[index] : nil
    }}

let array = [1, 2, 3]for index in -20...20 {
    if let item = array[safe: index] {
        print(item)
    }}


查看完整回答
反对 回复 2019-08-09
?
至尊宝的传说

在Swift 2中有效

虽然已经有很多次回答了这个问题,但我想在Swift编程的时尚方面提出更多的答案,用Crusty的话来说就是:“先想想protocol

•我们想做什么?
只有在安全的情况下才能获得给定索引的元素Arraynil否则
•此功能应该什么为基础?
Array subscriptING
•哪里不从得到这个功能吗?
struct ArraySwift模块中的定义有它
•没有更通用/抽象的东西?
它采用protocol CollectionType哪种方式确保它
•没有更通用/抽象的东西?
它也采用protocol Indexable......
•是的,听起来像我们能做的最好。我们可以扩展它以获得我们想要的功能吗?
但我们的类型非常有限(没有Int)和属性(没有count)现在一起工作!
•这就够了。Swift的stdlib做得很好;)

extension Indexable {
    public subscript(safe safeIndex: Index) -> _Element? {
        return safeIndex.distanceTo(endIndex) > 0 ? self[safeIndex] : nil
    }}

¹:不是真的,但它提出了这个想法


查看完整回答
反对 回复 2019-08-09

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信