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

2024-05-29

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

var str = ["Apple", "Banana", "Coconut"]

str[0] // "Apple"
str[3] // EXC_BAD_INSTRUCTION

但是,我会想到所有可选的链接和safetySwift 带来的,做类似的事情是微不足道的:

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

代替:

let theIndex = 3
if (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?
    }
}

亚历克斯的回答 https://stackoverflow.com/a/25330930/1607485对于这个问题有很好的建议和解决方案,但是,我碰巧偶然发现了实现此功能的更好方法:

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
    }
}

Example

let array = [1, 2, 3]

for index in -20...20 {
    if let item = array[safe: index] {
        print(item)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 中通过可选绑定进行安全(边界检查)数组查找? 的相关文章

  • 连接到 Apple Music

    所以我尝试使用 React Native 应用程序从 iOS 设备连接到 Apple Music 有一个 API 可以执行相同的操作 但我需要从 storekit 框架调用一个函数 提出个性化请求 苹果音乐API https develop
  • Swift 制作按钮超链接

    我使用的是 swift 因为它是一种相当新的编程语言 所以没有太多关于它的文档 我正在尝试使按钮充当超链接 我已经创建了一个 IBAction 但我不知道从哪里开始 这是我的代码 import UIKit class ViewControl
  • SwiftUI - 在预览中模拟 @EnvironmentObject 数据

    我有这个代码 struct WelcomeView View EnvironmentObject var userService UserService var body some View Text userService user us
  • Default.png 在模拟器中显示,但在真机 iPhone 上不显示?

    我通过添加 Default png 向我的应用程序添加了启动屏幕 启动画面在模拟器中工作正常 但在真实设备上不显示 检查文件名的大小写 Default png default png Default PNG 和 DEFAULT png 在设
  • 隐式模板参数

    以下代码在 Xcode 中生成编译错误 template
  • pod 安装后 Xcode 8 swift pod 标头为空

    我正在尝试编译一个用 swift 编写的现有 xcode 项目 该项目使用 Alamofire 我安装了 xcode 8 beta 并打开了项目 Alamofire 有很多错误 我了解到需要更新到版本 3 2 1 我编辑了 Podfile
  • 访问全局函数内的环境变量 - SwiftUI + CoreData

    我正在开发一个列表应用程序 并且我有一些针对一种特定数据类型的添加 删除 编辑 加载功能 但是我想概括这些功能 这样我就可以从内部对任何数据类型执行相同的操作任何观点 我已经设置了一个全局变量类 import SwiftUI import
  • 我以前从未见过的奇怪的 xCode 链接器错误说“断言失败”

    通过Unity构建了这个游戏 并通过xCode成功编译过一次 然而 如果没有任何明显的变化 就会出现此错误消息 我不明白从哪里开始寻找解决方案 但也许其他人有线索 我通过搜索看到了类似的错误 尽管与我的相比 这些修复似乎是任意的 有人能透露
  • 我删除了 Xcode 中的本地化,然后无法添加任何本地化

    我错误地从项目信息中删除了项目的本地化信息 故事板和相关语言都被删除 我从以前的文件中取回了故事板 但是当我想添加新的本地化时 会弹出一个窗口并要求我 选择文件和参考语言来创建英语本地化 并且根本没有资源文件 如何添加回本地化内容 添加回本
  • 如何对 SwiftyJSON JSON 对象进行子集化

    我正在构建一个 iOS 应用程序 其中我的一个 API 调用返回一个大型 JSON blob 我使用 SwiftyJSON 将其加载到 JSON 对象中 例如 它看起来像这样 data name object name id 1 descr
  • 如何在iOS中将底部安全区域设置为XIB?

    我想打开自定义弹出视图 在 XIB 中设计 它从底部显示 但现在在 iPhoneX 模拟器中 它从屏幕底部显示 我想在安全区域打开弹出窗口 iPhone X 的结果 并且 XIB 布局有约束 简单来说解决方案 使用超级视图删除底部约束并将其
  • iOS:无法从 Swift 建立 RabbitMQ 连接

    我正在尝试从 Swift 连接 RabbitMQ 我已关注this https github com rabbitmq rabbitmq objc client 图书馆 创建 Pod 设置并进入工作区 已检查并核实 成功运行 viewDid
  • 尝试从 json 获取数据时对成员 `jsonObject(with:options:)` 的引用不明确

    我是 Swift 新手 在制作其中一个教程 相当旧 时涉及通过返回 JSON 的 php 从服务器获取凭据 但我遇到了错误Ambiguous reference to member jsonObject with options 在 jso
  • 在没有按钮的 SwiftUI 中呈现新视图

    所以我想使用 SwiftUI 呈现一个新视图 而用户不必点击按钮 因为NavigationButton会用那个 这是一个例子 struct ContentView View var model Model var body some Vie
  • 裁剪图像和中心

    在 Swift 中如何裁剪图像并将其放在中心 我已经裁剪了图像 但想将其放在中间 ImgView image OrigImage var masklayer CAShapeLayer masklayer frame ImgView fram
  • 致命错误:在解包可选值时意外发现 nil (lldb)

    override func prepareForSegue segue UIStoryboardSegue sender AnyObject if segue identifier showLocalMenuDetail if let in
  • UniversalLink 不适用于 iOS 14 设备,但在模拟器上运行良好

    以下解决方案可以在模拟器上支持universalLink 我有一个支持 UniversalLink 的应用程序 用户单击网站中支持的链接 将导航到应用程序中的功能 但它无法在 iOS 14 beta 4 上运行 它不是打开应用程序 而是打开
  • 带参数标签的 Swift 下标

    是否可以创建一个可以使用显式参数标签调用的下标 struct MyType subscript label Bool gt String return nil let test MyType let value1 test true ok
  • 禁用应用程序的启动图像

    我想从我的应用程序禁用启动图像 我已经有一个启动屏幕 因此在应用程序启动时首先显示启动图像 然后显示启动屏幕 我想禁用启动图像并仅在应用程序启动时显示启动屏幕 请帮忙 提前致谢 你不能 因为它会一直保持到你的程序被加载并从applicati
  • 在 Swift 中将 UIImage 转换为 NSData 并转换回 UIImage?

    我正在尝试保存一个UIImage to NSData然后阅读NSData回到一个新的UIImage在斯威夫特 要转换UIImage to NSData我正在使用以下代码 let imageData NSData UIImagePNGRepr

随机推荐