没想到Swift里KVC还能有坑

起因

最近看了@南峰子_老驴写的ViewStyle。利用KVC的来简化抽取出控件设置style的代码,想达到一个css的效果。这个库用swift编写,使用起来大概这样:


  1. class ViewController: UIViewController { 
  2.  
  3.   
  4.  
  5.     var tableView: UITableView? 
  6.  
  7.   
  8.  
  9.     override func viewDidLoad() { 
  10.  
  11.         super.viewDidLoad() 
  12.  
  13.         tableView = UITableView(frame: self.view.bounds) 
  14.  
  15.   
  16.  
  17.         tableView!.mi_styles = self.tableViewStyle 
  18.  
  19.   
  20.  
  21.         self.view.addSubview(tableView!) 
  22.  
  23.     } 
  24.  
  25.  
  26.   
  27.  
  28. // MARK: - Table View Style 
  29.  
  30.   
  31.  
  32. extension ViewController { 
  33.  
  34.     var tableViewStyle: [Property: Any] { 
  35.  
  36.         return [ 
  37.  
  38.             .rowHeight: 60.0, 
  39.  
  40.             .separatorStyle: UITableViewCellSeparatorStyle.singleLine, 
  41.  
  42.             .separatorColor: UIColor.lightGray, 
  43.  
  44.             .backgroundView: UIView(), 
  45.  
  46.             .separatorInset: UIEdgeInsets(top: 10.0, left: 5.0, bottom: 3.0, right: 10.0), 
  47.  
  48.             .cellLayoutMarginsFollowReadableWidth: true 
  49.  
  50.         ] 
  51.  
  52.     } 
  53.  
  54. }  

阅读源码后发现有些属性在swift是不能直接KVC的,和OC有些区别。

Bool值:isHidden

先来看下正常的在swift中kvc的套路:


  1. let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 
  2.  
  3. view.setValue(UIColor.blue, forKey: #keyPath(UIView.backgroundColor))  

在swift 3中提供了#keypath()来省去开发者直接输入字符串的尴尬。

然而,如果这个属性是isHidden的话运行起来就会报错。

控制台会输出错误:


  1. ‘[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key isHidden.’ 

提示我们没有isHidden这个属性。

那为什么我们平时没有注意到这个问题呢?


  1. view.isHidden = true 

这么写代码是没问题的。

其实就是Swift团队在升级3.0的时候keypath忘记做这个功能了。。。

你可以安慰自己这个功能在swift 2.0的时候还是好好的。

如果读者写过OC这个原因很容易猜到。有些单独声明过getter的bool值直接kvc会报错。比如isHidden这样:


  1. @property (nonatomic, getter=isHidden) BOOL hidden; 

UIView上确实没有isHidden属性,那么怎么解决呢?只能回到老路上了:


  1. view.setValue(true, forKey: "Hidden") 

Enum

KVC在设置枚举的时候也会报错。

错误提示的无效的参数类型。

因为setValue的参数类型是Any,所以这里参数可以是任意类型,没有类型检查。但是这毕竟是一个OC的方法,所以无法直接使用swift的类型(其实String到NSString也是有转换的,只是编译器帮我们做了这层转换)。

前面直接赋值的时候是正常的,但是调用KVC方法的时候编译器没有帮我们转。所以这里报错了。

那就只能自己手动转换了:


  1. view.setValue(UIViewTintAdjustmentMode.automatic.rawValue, forKey: "tintAdjustmentMode") 

在OC中的枚举其实就是对应几个数值,这里直接取出rawValue的值就可以正常使用了。

最后我有一句话想对swift说:

本文作者:佚名

来源:51CTO

时间: 2024-09-27 18:45:27

没想到Swift里KVC还能有坑的相关文章

中国电子商务的标志性事件:没想到如此剧烈

"淘宝迟早要再次明确自己的定位,就如同中国电子商务行业必然要进行的升级一样,只是没想到变化来得如此剧烈."一位从业10年的网上商城负责人昨日对北京晨报(微博)记者评论说. 在他看来,正品.高质量.优质网上商城一定是中国电子商务行业的方向,这可以解释为什么淘宝商城(微博)要再一次做品质上的强调,比如冻结"违约保证金".但有意思的是,由淘宝一手推动的电子商务繁荣已是既成事实,网商们成了一股力量,他们也开始利用互联网工具,跟大平台分庭抗礼. 从这个意义上讲,淘宝商城事件可

《万万没想到》

15日,优酷出品.万合天宜联手打造的Mini剧<万万没想到>导演叫兽易小星发布一张他与TF BOYS成员易烊千玺合影,确认其将参演<万万没想到>第二季.而在随即发出的<万万没想到>第二季的预告片中,韩寒.刘烨.赵薇.林心如等一大波明星正在逼近,纷纷送上祝福,"火华哥"刘烨更是在预告片中撒娇打滚求客串.同时发布的海报中,人物形象多变造型颠覆剧情扑朔迷离,尽显大片气势的同时让人摸不着头脑,随着7月1日正式上线,一切谜底也终将揭开. 易烊千玺参演<万

万万没想到:星际穿越是这样拍的!

万万没想到:星际穿越是这样拍的! 时间:2014-11-26 14:04 来源:电影娱情办 作者:何小沁 最近大热的<星际穿越>上映后,爆多解答术语和片中解密的文章,每天都能看到朋友圈各种刷屏各种科普,但就是没有说幕后的拍摄, 但是你能想到这电影用了非常少的电脑特效吗?几乎都是用传统胶卷机拍摄,飞船着陆的两个星球,都是在地球上实地拍摄的,去哪里找那么棒的场景!作为导演诺兰的脑残粉,今天来解密一下幕后的故事. "守旧导演"没3D爱胶片 没有满屏的电脑特效以及演员绿幕前&quo

马云心语:没想到会走到今天

摘要: 马云 关于挑战.路演. 谷歌 和阿里的秘密武器 文/秦朔 他的骨架也许是世界级企业家中最瘦的,他的体重也许是最轻的,但骨架上挑着的,一边是15年不变的伟大理想,一边是刚刚拿 马云 关于挑战.路演. 谷歌 和阿里的"秘密武器" 文/秦朔 他的骨架也许是世界级企业家中最瘦的,他的体重也许是最轻的,但骨架上挑着的,一边是15年不变的伟大理想,一边是刚刚拿到的美国股票发行史上规模最大的资金.而让理想和财富形成互动的,是 马云 这个清奇无比的大脑以及他领导的2.5万人团队的超常努力. 纽

万万没想到哪些快消品适合网络营销

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 上篇文章跟大家分享了一下快消品是否适合做网络营销,而我们知道在当今这个时候,快消品行业绝对有必要做网络营销,而且是越快越好.这几天也跟快消品行业的几个朋友一起聊了一下天,也有了一些收获,所以我们今天主要分享一下,哪些快消品适合做网络营销?很有可能是你万万没想到的!希望各位看官积极拍砖,您的拍砖就是对我最大的启发!谢谢大家!也希望大家可以跟我一

Swift里的值类型与引用类型区别和使用

  这篇文章主要介绍了Swift里的值类型与引用类型区别和使用,本文讲解了值类型与引用类型的区别.如何选择类型.什么时候该用值类型.什么时候该用引用类型等内容,需要的朋友可以参考下 Swift里面的类型分为两种: ●值类型(Value Types):每个实例都保留了一分独有的数据拷贝,一般以结构体 (struct).枚举(enum) 或者元组(tuple)的形式出现. ●引用类型(Reference Type):每个实例共享同一份数据来源,一般以类(class)的形式出现. 在这篇博文里面,我们

普京创造的五个没想到让中国人震惊

普京执政以来,尽管执政的模式是国家资本主义加资源资本主义,但是在关乎人民生活的这个基本问题上,普京的执政理念却是马克思恩格幻想的共产主义模式.研究俄罗斯问题的人,对普京的执政理念,总结了五个没有想到: 第一个没想到是住房不要钱:"在俄罗斯居民住房不收费,人均18平方米以下的部分无偿转给个人,18 平方米以上部分也只收很少的钱." 第二个没想到是用水没水表:用于日常生存所必需的"自来水.热水(一天24小时供应).供暖,从来就不收费,索性连水表都省了." 第三个没想到看

本以为灰指甲已经治好,没想到停药后更加严重

本以为灰指甲已经治好,没想到停药后更加严重 5年前,夏先生感染了灰指甲,2011年底他选择哈尔滨乐泰药业的"亮甲"进行治疗.经过一年多的治疗,花费了一万多元,灰指甲终于没了,夏先生停下药准备观察一段时间.谁知过了两个月,情况恶化了,刚刚变成粉嫩的新指甲,又变回了灰指甲. 不忍心拔指甲,选择亮甲治疗 2007年,夏先生发现自己左右手各有两个指甲,长得较其它指甲突出厚重,且颜色发灰,他意识到自己可能是感染上了灰指甲.听说灰指甲是真菌感染所致,夏先生担心传染给家人,于是开始四处用药治疗灰指甲

并购法国汤姆逊公司,没想到这次跨国“联姻”会结出一个难咽的“苦果”

6年前TCL集团(000100.SZ)董事长李东生决定并购法国汤姆逊公司时,可能没想到这次跨国"联姻"会结出一个难咽的"苦果".收购汤姆逊后,TCL集团在2005年.2006年连续亏损两年,戴上了*ST的帽子,2007年才好不容易实现扭亏.现在却又遭遇与汤姆逊合资成立的TTE欧洲公司的清算"后遗症"--昨晚,TCL集团在停牌一天后公告称,法国南特商业法庭于3月10日对TTE欧洲公司重组诉讼案的第一令诉讼作出初审判决,要求TCL集团.TCL多媒体及