Swift 中导入 NS_OPTIONS (RawOptionSetType) 的 Switch 语句?

2023-12-11

Swift 中的 switch 语句更具表现力。我想知道这是否可能:

让我们看看 UIViewAutoresizing 的例子。它在 Objective-C 中的定义如下:

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

我可以在 Swift 中像枚举一样使用它:

let foo = UIViewAutoresizing([.FlexibleHeight, .FlexibleTopMargin])

是否可以使用 switch 语句来代替多个 if 语句?

if foo & UIViewAutoresizing.FlexibleHeight != nil {

}

if foo & UIViewAutoresizing.FlexibleWidth != nil {

}

if foo & UIViewAutoresizing.FlexibleTopMargin != nil {

}

像这样的伪代码:

switch foo { // ** THIS IS PSEUDO CODE AND WILL NOT COMPILE **

case & .FlexibleHeight:
    println("height")

case & .FlexibleWidth:
    println("width")

case & .FlexibleTop:
    println("top")

}

我对这个问题感到非常沮丧,所以我写了一个Bitmask<T>可以处理这些用例的类。代码已在Github上:布林贝洛米/SwiftBitmask

它允许您使用任何类型的对象作为基础类型来执行类似的操作(这里我使用的是enum):

enum MonsterAttributes : IBitmaskRepresentable, IAutoBitmaskable {
    case Big, Ugly, Scary

    static var autoBitmaskValues : [MonsterAttributes] = [.Big, .Ugly, .Scary,]
    var  bitmaskValue: UInt16  { return AutoBitmask..autoBitmaskValueFor(self) }
    init(bitmaskValue: UInt16) { self = AutoBitmask.autoValueFromBitmask(bitmaskValue) }
}

// various ways to initialize
let option : MonsterAttributes = .Ugly

let bitmaskOfOption        = Bitmask(option)
let anotherBitmaskOfOption = |MonsterAttributes.Ugly // same as bitmaskOfOption

let orWithVar = option | .Big                 // == Bitmask<MonsterAttributes> with a bitmaskValue of 1 | 2
let simpleOr  = MonsterAttributes.Big | .Ugly // == Bitmask<MonsterAttributes> with a bitmaskValue of 1 | 2

// getting the raw integral bitmask value
let simpleOrValue = simpleOr.bitmaskValue                        // == UInt16(1 | 2)
let orValue       = (MonsterAttributes.Big | .Ugly).bitmaskValue // == UInt16(1 | 2)

// implements BooleanType
if simpleOr & .Ugly             { /* this code will execute */ }

// supports pattern matching operator
if simpleOr ~= .Ugly            { /* this code will execute */ }
if simpleOr ~= (.Ugly | .Scary) { /* this code will execute */ }

...您所要做的就是实施单一属性协议。

我真的很好奇是否有人对代码有任何反馈或想法,所以如果您有任何想法,请在队列中留下问题!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 中导入 NS_OPTIONS (RawOptionSetType) 的 Switch 语句? 的相关文章

随机推荐

  • 获取原始文件名谷歌应用引擎

    当在谷歌应用程序引擎上收到文件上传时 这个例子假设您收到的是 png 但是 您只能通过文件名的扩展名知道图像的类型 如何获取GAE上上传的原始文件名 正在上传的文件的文件名可以通过查看来确定filename保存文件的变量的属性 例如 假设您
  • Mechanize 不显示 FB 消息表单

    import mechanize cookielib br mechanize Browser cookie jar cookielib CookieJar br set cookiejar cookie jar br addheaders
  • Android同步cookies webview和httpclient

    我有一个登录 webview 和 httpclient 需要确认用户是否登录 问题是 webview 和 httpclient 正在使用其他 cookie 因此 httpclient 无法获取 webview cookie 我读了很多人的问
  • 更改 Html.TextBox 的大小

    我正在使用新的 Razor 视图引擎开发 ASP NET MVC3 应用程序 但在更改 TextBox 使其成为多行时遇到一些困难 到目前为止 我通过谷歌找到的只是我需要将多行属性设置为 true 但我不知道如何设置 查看代码如下所示 di
  • Java 绑定异常

    即使重用地址设置为 true 什么会导致 TCP 套接字抛出 java net BindException 地址已在使用中 仅当应用程序快速重新启动时才会发生这种情况 在 CentOS 5 Linux 操作系统上运行 这有点解释它 http
  • Tinymce 与 Angular 2/4 的双向绑定

    这是我的tinymce component ts import Component OnDestroy AfterViewInit EventEmitter Input Output from angular core Component
  • 如何为 Web 客户端打开自动重定向

    我有这个代码 class CustomWebclient WebClient System Security SecuritySafeCritical public CustomWebclient base public CookieCon
  • FastMember列顺序保存

    使用 TypeAccessor Create FastMember 时似乎总是返回按字母顺序排序的列列表 是否可以告诉它保留类中列的顺序 例如 var testClass new B 1 A 2 将从 GetMembers 返回 A 列 然
  • 如何使用 JWT 授权 SignalR Core Hub 方法

    我在 ASP NET Core 2 0 应用程序中使用 OpenIddict 进行 JWT 身份验证 我正在遵循的想法这个线程并打电话AuthorizeWithJWTSignalR 握手后的方法 但现在我不知道我应该设置什么Authoriz
  • 尝试修复 AVAudioPlayer 初次使用时的滞后问题

    这个问题已经出现在其他几个问题中 第一次播放声音时 AVAudioPlayer 启动缓慢 使用 AVAudioPlayer 播放声音时出现延迟 我已尝试实施建议的修复 但没有一个能解决我的问题 我的应用程序向用户呈现一系列可供触摸的对象 当
  • 如何使用 JavaScript 正则表达式进行跨换行匹配?

    我有这样的表达 document ready function validator addMethod regex function value element return this optional element www http c
  • 如何根据用户的请求暂停和恢复多个 Java 线程?

    我正在创建一个 20 分钟倒计时器应用程序 我正在使用 JavaFX SceneBuilder 来执行此操作 计时器由两个标签组成 一个代表分钟 一个代表秒 每个标签由一个CountdownTimer类对象 和进度条 计时器看起来像this
  • C++ 中的 char* 和 cin

    我想使用 cin 将不定长度的字符串输入到 char 变量中 我可以做这个 char tmp My string cout lt lt tmp lt lt endl system pause 它工作完美 但我没能做到这一点 char tmp
  • Socket.IO node.js websocket连接无效端口8081

    我在这个论坛上看到过一些关于 Socket IO 和 node js 的帖子 但仍然没有达到最佳工作状态 我的网络服务器将端口 80 和端口 8080 用于不同的应用程序 因此 在 App js 和我的套接字连接中 我添加了端口 8081
  • 我无法在框架布局内移动按钮

    我尝试使用图形界面和 XML 文件中的 android layout alignParentLeft 移动按钮 无论如何它不起作用 我的Android Studio版本是2 2 3 你有遇到过这个问题吗 你需要相对布局或其他与父容器类似的布
  • MySQL Workbench 获得管理访问权限吗?

    我从一个月开始就运行 MySQL 5 6 一切都很顺利 还有 MySQL Workbench 6 如果我想查看 服务器状态 我会收到两个错误 第一个错误 Could not acquire management access for adm
  • 如何获取从一个集合到另一个集合的数据引用?蒙古数据库

    router get productSelect req res next gt productSchema aggregate lookup from supplierSchema localField supplierId foreig
  • 带有前导零的数字的奇怪行为[重复]

    这个问题在这里已经有答案了 我有一些带有一些整数的 PHP 代码 并且一切正常 除非我有08 or 0X作为整数 当我把它们放在引号中时 一切都很好 示例数字 2 Works fine 08 Doesn t work 012 Doesn t
  • java中如何将json对象转换为HTML格式?

    java中如何将json对象转换为HTML 此代码将任何 Json 对象显示为 HTML 使用 org json lib Get the JSON data formated in HTML public String getHtmlDat
  • Swift 中导入 NS_OPTIONS (RawOptionSetType) 的 Switch 语句?

    Swift 中的 switch 语句更具表现力 我想知道这是否可能 让我们看看 UIViewAutoresizing 的例子 它在 Objective C 中的定义如下 typedef NS OPTIONS NSUInteger UIVie