说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Swift的坑:如何实现enum的多选?

HTML文档下载 WORD文档下载 PDF文档下载
在Objective-C中,enum是可以多选的,通过将两个enum用“|”括起来,就能够达到多选的效果。那么,在Swift中,如何实现相同的效果?本文作者通过亲身实践及经验参考,给出了答案。

问题

在Objective-C中,enum是可以多选的。如:

NSString* string = @"一段文字";CGRect boundingRect = [string boundingRectWithSize:CGSizeMake(label.frame.width, CGFloat.max) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil];

把两个enum值用“|”括起来,就能达到多选的效果。那么,在Swift中,如何实现相同的效果呢?

Swift中的option类型

Swift的enum不支持多选,所以能够多选的option类型应该用struct : RawOptionSet来实现。要自己实现options类型,可以参考Stack Overflow上的答案,官方的SDK正是采取这种方法移植的。

正确的写法

以上例子中的代码,用Swift的正确写法如下:

let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeadinglet boundingRect = string.bridgeToObjectiveC().boundingRectWithSize(CGSizeMake(label.frame.width, CGFloat.max), options: options, attributes: attributes, context: nil)

iOS SDK的Bug

开发者直接在OS X 10.10中这样写即可,但在目前版本的iOS 8 SDK中,这样的写法却是编译通不过。这是因为在iOS 8的SDK里,NSStringDrawingOptions被移植为了enum : Int,而不是struct : RawOptionSet。如何解决这个问题呢?只能借用下Objective-C来workaround。

解决方案

因为用到的options都相同,我只是简单地写了这个类:

  • OCUtils.h

@interface OCUtils : NSObject+ (NSStringDrawingOptions)stringDrawingOptions;@end

  • OCUtils.m

#import "OCUtils.h"@implementation OCUtils+ (NSStringDrawingOptions)stringDrawingOptions{    return NSStringDrawingTruncatesLastVisibleLine |    NSStringDrawingUsesLineFragmentOrigin |    NSStringDrawingUsesFontLeading;}@end

  • 在Bridging-Header.h中加上:

#import "OCUtils.h"

  • 用到的Swift文件:

let boundingRect = string.bridgeToObjectiveC().boundingRectWithSize(CGSizeMake(label.frame.width, CGFloat.max), options: OCUtils.stringDrawingOptions(), attributes: attributes, context: nil)

以上是总体原理,如果有进一步的需求,可以改得更通用一些。

本文转载自:仓薯博客

(责编/唐小引)

《近匠》第12期:Yeelink——智能硬件云服务 三星Galaxy S5:home键内置指纹识别传感器、5.25寸2K屏幕 Google发布Google Glass使用守则 三星将发布新款智能手表 搭载Tizen系统抛弃Android 从Camera360 V5版本发布,看现代相机应用趋势 索契冬奥会API:赛事的数据直播 为什么开源企业的开源大旗正在褪色 尘埃落定 腾讯确认投资大众点评,获20%股份 Unite China·2014:上千Unity开发者狂欢、五大精品课程全面开启 下载4万首歌曲仅需几秒——蓝色巨人IBM发布新传输技术 15核芯片+数据平台,Intel软硬兼备的Hadoop战略 Facebook以160亿美元收购50名员工、4.5亿月活跃用户的WhatsApp 2014年全美最吃香职业TOP100,程序员排第一 LinkedIn向所有用户开放博客发布平台 Google与Facebook的产品研发之道 小米海外扩张第一步 红米进军新加坡 Google I/O大会时间已定,Google Glass真的来了? 精英团队PK全能型数据科学家,拼的可不只是数量 专攻移动支付?PayPal将面向全球开放移动SDK CoconutKit:iOS开发必备的开源组件库 个人隐私是如何“泄漏”的:国内外互联网企业隐私策略对比 惠普2014年Q1财报:净利润同比增16% PC业务逆势好转 “阅后即焚”挖谷歌墙角,GAE技术大牛跳槽Snapchat 日800万访客、20万RPS网站的5个9可用性架构 程序员想找好工作?那就学好Linux吧! 一周消息树:开源专家袁萌,国产COS操作系统是“杂种”,不是中国软件梦 移动周报:对话智能硬件云服务平台Yeelink Node.app:用Node.js API开发iOS“原生”应用 Google Project Tango:能3D捕捉的智能手机 成功打造Evernote API生态系统的五大经验 研发周报:Google与Facebook的产品研发之道 高分急求高手:Sybase查询的汉字问题 哪位高手帮忙编写一个程序,使局域网各用户之间能传送文件!谢谢! 帮我译vb为c# VB.net如何在进程之间通讯,我用SendMessage发WM_COPYDATA给目标窗口,可是总是不行,请高手帮忙! 哪位高手帮忙编写一个程序,使局域网各用户之间能传送文件!谢谢! 哪位高手帮忙编写一个程序,使局域网各用户之间能传送文件!谢谢! 关于文件操作的那几个函数问题 如何初始化const char * p[5]数据成员? 如何安装WINME???急!,在线等!!! C文件读写(急,来者有分) ---控件--里连接---数据库---都有什么方法?SQL2K 正在搜索 请稍后 是怎么做的? 为什么这样做? 哪位高手帮忙编写一个程序,使局域网各用户之间能传送文件!谢谢! 再问,关于中文字符.急!!!! OleDbDataReader这个东西是不是不可以同时打开两个? 哪位高手帮忙编写一个程序,使局域网各用户之间能传送文件!谢谢! 日期的计算问题 哪位高手帮忙编写一个程序,使局域网各用户之间能传送文件!谢谢! 用jsp编打印图片的问题(很急) 谁第一个来,谁得分 哪位高手帮忙编写一个程序,使局域网各用户之间能传送文件!谢谢! 今天生日,除了MM没人祝我生日快乐,只好自已祝福自已了(散分) 如何将表单提交到数据库中? 在线等!!!!!!!!!!!! 哪位高手帮忙编写一个程序,使局域网各用户之间能传送文件!谢谢! 哪位高手帮忙编写一个程序,使局域网各用户之间能传送文件!谢谢! 如何在屏幕任意位置显示移动的文字 收到了数字情书,我嫩是解不开。。帮帮我吧,不好回了。 如何让winamp慢速播放mp3? 哪位高手帮忙编写一个程序,使局域网各用户之间能传送文件!谢谢! 在服务器端的DLL文件中如果获取网站在服务器的磁盘上的路径? 在水晶报表中如何控制所显示记录的条数! 一个超级奇怪的iis问题??????? 一路同行?我开始学习C#, 我是一从为接触过单板的人,学的是软件。现在我想提一个问题。 如何解决UNIX通讯问题? 关于读出文件里的字符串与录入的字符串比较问题 哪位高手帮忙编写一个程序,使局域网各用户之间能传送文件!谢谢! help!有关SESSIONBEAN! 无法联接ORACLE数据库,错误信息:ORA-01034:ORACLE not available 其它信息 sos 用vb怎么实现打印功能啊,不是vb附带的那小功能啊,把家帮帮忙啊,。。。sos 请教高手:视频传输编程技术!!! 请教!.net的程序一定要 各位大侠:小女请教一问题 求救!美编的工作站显示器只能显示黑白了! Excel控件使用之怪现象,请DX们诊断诊断 ACCESS转为SQLSERVER后的问题~~ 这是什么错误? asp中怎么读取xml中的元素值呀? 请问,DATAGIRD能否在编辑时,在表格里使用下拉框控件,如何使用??谢谢 哪里有delphi中文帮助 飞机如何着陆特情:双发飞机单发空中停车,跑道湿滑或结冰,大风侧滑,若必须着陆,怎么办?机腹接在草地上么? 从飞机着陆到乘客下飞机要多久?在多少分钟以内?不需要摆渡车 求解答(全部).在下谢谢各位英雄好汉了. 全部的.在下谢谢各位英雄好汉了. 昆虫音乐会有哪些昆虫?比如:蜻蜓等等 关于剑与日本刀的铸造问题请问剑或刀能够铸造成黑色的吗?而且黑色的有没有实用价值?是刀刃那部分哦,不是持剑的那个位置(比如死神中黑崎一护的那把剑) 你觉得诸葛亮和蔺相如有什么共同之处? 关于带点粒子在匀强电场与匀强磁场中的运动,说法错误的是A.沿电场线方向进入电场,电场力对电荷做负功,动能一定变大B.沿磁感线方向进入磁场,磁场力不做功,动能不变C.垂直电场线方向进 怎么把“诗化了邂逅”改成带有漂亮符号的繁体字要漂亮一点的符号和繁体字 飞机怎样落地 飞机是怎么落地的? 调查:美国幼童使用移动设备已成为普遍美国有意叫停窃听盟国元首 部门“内讧欧洲风暴肆虐 高校推风暴命名项目收费韩外长:日本错误历史认知阻碍韩日关系日知名主播之子因盗窃被解雇 检方暂不奥巴马提名两名竞选支持者为美国驻外大韩在独岛海域清理垃圾17吨 吁居民游日土发表共同宣言 安倍决心加强战略伙意大利比萨斜塔修复见成效 12年扶正美称法国西班牙自行实施电子窃听行动 美称法国西班牙自行实施电子窃听行动 石市图书馆公布图书借阅排行榜 最高借石市地税局国际税务管理局税收宣传注重廊坊市重污染天气应急预案升级 提前1市民4月26日可到石图讲堂重读经典百余人亲临地学博览园 感受地球魅力 沧州:光明小学举行首届国防教育文化节河北经贸大学学生组织“走进社区”系列打造国际高端旅游项目 推进秦皇岛旅游石家庄市新石街道办组织辖区退休人员集李克强考察福建自贸区昆明市中级人民法院探索设立“外勤送达
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘