如何在 Swift 中枚举 OptionSetType?

2024-06-26

我在 Swift 中有一个自定义的 OptionSetType 结构。如何枚举一个实例的所有值?

这是我的选项集类型:

struct WeekdaySet: OptionSetType {
    let rawValue: UInt8

    init(rawValue: UInt8) {
        self.rawValue = rawValue
    }

    static let Sunday        = WeekdaySet(rawValue: 1 << 0)
    static let Monday        = WeekdaySet(rawValue: 1 << 1)
    static let Tuesday       = WeekdaySet(rawValue: 1 << 2)
    static let Wednesday     = WeekdaySet(rawValue: 1 << 3)
    static let Thursday      = WeekdaySet(rawValue: 1 << 4)
    static let Friday        = WeekdaySet(rawValue: 1 << 5)
    static let Saturday      = WeekdaySet(rawValue: 1 << 6)
}

我想要这样的事情:

let weekdays: WeekdaySet = [.Monday, .Tuesday]
for weekday in weekdays {
    // Do something with weekday
}

从 Swift 4 开始,标准库中没有方法 枚举一个元素OptionSetType(斯威夫特2)分别。OptionSet(斯威夫特 3、4)。

这是一个可能的实现,它只检查每个位 基础原始值,并且对于设置的每个位, 返回相应的元素。 “溢出乘法”&* 2用作左移,因为<<只为具体的整数类型定义,但不为IntegerType协议。

斯威夫特 2.2:

public extension OptionSetType where RawValue : IntegerType {

    func elements() -> AnySequence<Self> {
        var remainingBits = self.rawValue
        var bitMask: RawValue = 1
        return AnySequence {
            return AnyGenerator {
                while remainingBits != 0 {
                    defer { bitMask = bitMask &* 2 }
                    if remainingBits & bitMask != 0 {
                        remainingBits = remainingBits & ~bitMask
                        return Self(rawValue: bitMask)
                    }
                }
                return nil
            }
        }
    }
}

用法示例:

let weekdays: WeekdaySet = [.Monday, .Tuesday]
for weekday in weekdays.elements() {
    print(weekday)
}

// Output:
// WeekdaySet(rawValue: 2)
// WeekdaySet(rawValue: 4)

Swift 3:

public extension OptionSet where RawValue : Integer {

    func elements() -> AnySequence<Self> {
        var remainingBits = rawValue
        var bitMask: RawValue = 1
        return AnySequence {
            return AnyIterator {
                while remainingBits != 0 {
                    defer { bitMask = bitMask &* 2 }
                    if remainingBits & bitMask != 0 {
                        remainingBits = remainingBits & ~bitMask
                        return Self(rawValue: bitMask)
                    }
                }
                return nil
            }
        }
    }
}

Swift 4:

public extension OptionSet where RawValue: FixedWidthInteger {

    func elements() -> AnySequence<Self> {
        var remainingBits = rawValue
        var bitMask: RawValue = 1
        return AnySequence {
            return AnyIterator {
                while remainingBits != 0 {
                    defer { bitMask = bitMask &* 2 }
                    if remainingBits & bitMask != 0 {
                        remainingBits = remainingBits & ~bitMask
                        return Self(rawValue: bitMask)
                    }
                }
                return nil
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Swift 中枚举 OptionSetType? 的相关文章

  • 如何在 Swift 中枚举 OptionSetType?

    我在 Swift 中有一个自定义的 OptionSetType 结构 如何枚举一个实例的所有值 这是我的选项集类型 struct WeekdaySet OptionSetType let rawValue UInt8 init rawVal
  • iOS 应用程序中的谷歌地图实时交通状况?

    如何使用 google 地图 sdk 或 api 在 ios 应用程序中添加当前交通状况 如下图所示 有 javascript api 但我没有找到任何适用于 iOS 应用程序的解决方案 只需在 iOS SDK 中添加一行代码即可启用或禁用
  • 在 Alamofire 中快速发送 GET 请求中的 json 对象

    我正在尝试执行一个绑定了 json 对象的 GET 请求 这就是我生成 JSON 对象的方式 let jsonObject String AnyObject ean code type match value 16743799 然后我执行了
  • 使 Swift 类符合需要 init 的协议

    我有以下内容protocol in Swift protocol FooConvertible typealias FooType init foo FooType 我会做Swift类在类定义中符合它 class Bar FooConver
  • 可达性更改通知应仅调用一次

    我在我的 swift 项目中使用了 Reachability 我在 AppDelegate 中有以下代码 NSNotificationCenter defaultCenter addObserver self selector reacha
  • 为什么快速枚举中的可选项会导致无限循环?

    评估以下代码 我希望打印一次Hello World 相反 它会导致无限循环 有人可以解释为什么吗 let array what for text String in array print Hello World 删除可选的 显然让它只打印
  • 在 swift 中获取用户可读的类名版本(在 objc NSStringFromClass 中就可以了)

    Swift 中是否有相当于 NSStringFromClass 的类名 可以提供用户可读的版本 我尝试将它与我创建的本机 Swift 类一起使用 但如您所见 结果似乎是编译器对类名的内部表示 println NSStringFromClas
  • XC测试元组

    我正在尝试构建一个单元测试 如下所示 region is a Double Double tuple XCTAssertEqual region 0 0 200 0 但 Xcode 给我一个错误 Cannot invoke XCTAsser
  • Xcode 6.3 Parse SDK 1.7.1 PFTableViewCell 错误“具有不兼容的类型”

    My code override func tableView tableView UITableView cellForRowAtIndexPath indexPath NSIndexPath object PFObject gt PFT
  • 将多个数组合并为一个数组

    如何将多个数组合并为一个二维数组 鉴于我有以下输入 var arr1 1 2 3 var arr2 a b c var arr3 aa bb cc 我需要这样的输出 1 a aa 2 b bb 1 c cc 我认为你想要的是将三个数组组合成
  • 使用 Swift 查询可用的 iOS 磁盘空间

    我正在尝试使用以下命令获取可用的 iOS 设备存储空间Swift 我发现了这个功能here https stackoverflow com a 25142432 633251 func deviceRemainingFreeSpaceInB
  • 在 iOS 中使用 webView 集成 Instagram 失败

    在我的应用程序中 我使用 webView 进行 Instagram 身份验证 首先它显示 Instagram 登录屏幕 成功登录后我正在获取 accessToken 然后我使用 accessToken 获取其他详细信息 这是我在 viewD
  • swift - 仅在落地时跳跃

    我希望限制我的角色 猫 使其仅在地面 虚拟 SKNode 或树上 treeP SKNode 时跳跃 目前我没有任何限制touchesBegan因此 如果用户快速连续点击 猫就能够在空中飞翔 虽然这在其他游戏中可能很有用 但在这里不受欢迎 如
  • 为什么字符串加法需要这么长时间才能构建?

    我正在添加文本UIlabel 及其性能成本 我使用过构建时间分析器使用此链接 https stackoverflow com questions 43455325 swift build time too long when the con
  • 自定义 URL 方案

    如何处理自定义 URL 方案以允许一个应用程序定向到另一个应用程序 例如instagram user username someusername它通过用户名将用户直接引导至用户个人资料 我需要创建类似的东西 我已经结账了applicatio
  • Swift PerformSegueWithIdentifier 不起作用

    我试图在用户成功登录其帐户后切换视图控制器 但它无法正常工作 我无法直接使用 segue 因为如果单击登录按钮 无论信息是否正确 它都会转到该视图控制器 我已经尝试了我所知道的一切 但没有成功 这是我正在尝试的代码 IBAction fun
  • 裁剪图像和中心

    在 Swift 中如何裁剪图像并将其放在中心 我已经裁剪了图像 但想将其放在中间 ImgView image OrigImage var masklayer CAShapeLayer masklayer frame ImgView fram
  • 带参数标签的 Swift 下标

    是否可以创建一个可以使用显式参数标签调用的下标 struct MyType subscript label Bool gt String return nil let test MyType let value1 test true ok
  • 使用文本编辑器避免在 SwiftUI 中使用键盘

    我正在尝试重新创建 iOS 笔记应用程序的简单版本 请注意 我是一个十足的 Swift 新手 我当前的问题是我希望我的视图在键盘出现时向上移动 我已经实现了一些代码does这样做 但它有一些讨厌的错误 它首先将视图移动得太高 然后当您开始打
  • 如何在 Swift Playground 中将文本转换为 OSX 语音

    我正在尝试学习如何为 OSX 进行文本转语音 notiOS 在 Swift 中 我有一个带有代码的游乐场 import Cocoa let synth NSSpeechSynthesizer synth startSpeaking Hell

随机推荐

  • 在方法签名中使用 new 关键字通常只是为了可读性吗?

    我读过关于new关键词在方法签名中并看到了下面的例子this https stackoverflow com questions 1014295 c sharp new keyword in method signature发帖了 但还是不
  • 连接到 Amazon EC2 实例时 SSH 挂起

    我可以使用以下命令连接到 ec2 实例 但今天我无法使用它进行连接 ssh i abcKey pem email protected cdn cgi l email protection v 以下是详细内容 我已经在 EC2 中打开了 SS
  • Java 中使用 PBKDF2 进行密码验证

    我正在用 Java 进行基于密码的文件加密 我使用 AES 作为底层加密算法PBKDF2WithHmacSHA1使用以下代码从盐和密码组合中派生密钥 我从本网站上的另一位慷慨的海报获得 SecretKeyFactory f SecretKe
  • 聚类算法采用哪种编程结构

    我正在尝试实现以下 分裂 聚类算法 下面是该算法的简短形式 完整的描述可用here https dl dropboxusercontent com u 540963 diana pdf 从样本 x i 1 n 开始 将其视为由 n 个数据点
  • 如何在 Android Q 上将照片广播到图库

    我使用这些代码拍照并将照片广播到画廊 它有效 我发现我的广播功能使用MediaStore Images ImageColumns DATA and Intent ACTION MEDIA SCANNER SCAN FILE 并且这些已被弃用
  • python 日志记录:当级别 >= ERROR 时,通过电子邮件将整个日志文件作为附件发送

    我的日志系统有一些处理程序 日志文件 INFO 电子邮件处理程序 gt ERROR 和用于可选调试的流处理程序 当发生错误 异常 关键消息时 我希望电子邮件处理程序将日志文件从文件处理程序附加到错误电子邮件 import logging d
  • Java中C是A的子类时“C c = new C()”和“A c = new C()”的区别

    假设我们有类 A 作为父类 以及扩展它的类 C class A void m System out println A m class C extends A Override void m System out println C m 和
  • 我如何在 WPF 中模仿这种行为?

    我对 WPF 和 C 开发相当陌生 我正在制作这个应用程序 我不知道是否有人熟悉 VOIP App Discord 但他们有一个我非常喜欢的特定行为 并且想尝试使用 WPF 创建类似的风格 当您在 Discord 上添加服务器时 单击一个按
  • 重定向后丢失会话变量

    用户填写用户名和密码 如果正确 页面会加载一些信息 例如user id到会话变量 该脚本制作了一个header Location 重定向 不知何故 下一页无法识别会话 怎么会 重定向到同一个域 并且所有页面都有session start 我
  • 将 div 移动到 dom 中的其他位置

    以下代码被动态插入到 DOM 中 但是 我想将 div example 从原来的位置移动并将其添加到 wrapper 前面 我如何使用 jQuery 来实现这一目标 div div div div div div div div I tri
  • ruby require 问题(与 $LOAD_PATH 有关)

    我正在尝试使用我刚刚安装的 gem 通过sudo gem install excelsior 像这样 需要 红宝石 要求 精益求精 这在 irb 中工作得很好 但是当我将完全相同的代码粘贴到 rb 文件中并尝试使用 ruby 运行它时 我得
  • 实体框架 4 将订单链接到拥有 10,000 个订单的客户非常慢

    这个把我难住了 我有一个客户和订单实体 客户可以有多个订单 当我创建新订单并设置 Customer 属性 Order Customer customer 时 如果客户有 10 000 个订单 则会有很长的延迟 20 秒 在添加这个新订单之前
  • Angular 5 服务中的窗口对象

    我有 Angular 项目 具体来说是用户面板 所有页面都是 php 的 只有面板是 Angular 的 如何使用window服务中的对象 我想用window location与 HTML 中的 href 完全相同的操作 它使我返回到主站点
  • Grails 4“静态类型检查”错误仅适用于日期对象[重复]

    这个问题在这里已经有答案了 所以我从 Grails 3 3 x 迁移到 4 0 13 当我尝试编译我的应用程序时 当我尝试使用format任何 Date 属性的方法 例如 class Event Date startDateTime Dat
  • 从 Xcode 中的 OSX 模拟器删除应用程序

    如何像在 iOS 模拟器上一样从 OSX 模拟器中删除应用程序 由于核心数据 xcdatamodeld 的更改 我想删除一个应用程序 但我找不到方法 提前致谢 对于 macOS Monterey 和 Big Sur 该位置链接到设备文件夹位
  • SonarQube 是 Checkstyle、PMD、FindBugs 的替代品吗?

    我们正在从头开始开发一个 Web 项目 并正在研究以下静态代码分析工具 约定 Checkstyle 不良做法 PMD 潜在的错误 FindBugs 该项目是基于 Maven 构建的 我没有使用多个工具来实现此目的 而是寻找一个灵活的解决方案
  • 找到每个元素的所有父元素

    我正在尝试创建一个面包屑而不使用 url 路由提供者 并且不使用 jQuery 我有一棵这样的树 Humans Trees Animals Cats Lions Dogs Terrier Bulldog Cocker Cars 我希望当我点
  • 基准测试:PostgreSQL 上的 bigint 与 int

    我想提高数据库性能 在一个项目中 所有表都来自int to bigint 我认为这不仅在存储方面是一个糟糕的选择 因为int需要4 bytes and bigint需要8 bytes 但也与性能有关 所以我创建了一个小表1000万条目 其中
  • JarSplice 的命令行参数?

    罐子接头 http ninjacave com jarsplice允许将 jar 文件以及其他依赖项和库聚合到一个可执行 jar 文件中 但是 我的可执行 jar 需要两个命令行参数 当我调用 JarSplice jar 时 这两个参数似乎
  • 如何在 Swift 中枚举 OptionSetType?

    我在 Swift 中有一个自定义的 OptionSetType 结构 如何枚举一个实例的所有值 这是我的选项集类型 struct WeekdaySet OptionSetType let rawValue UInt8 init rawVal