扫描二维码,下载安卓APP
下载安卓APP箭头
客服QQ
箭头给我发消息

客服QQ:2698585038
论坛 >移动开发 >没想到 Swift 里 KVC 还能有坑

没想到 Swift 里 KVC 还能有坑

qsl发布于 2017-11-06 09:40查看:11592回复:1

    起因

        利用KVC的来简化抽取出控件设置style的代码,想达到一个css的效果。这个库用swift编写,使用起来大概这样

image.png

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

     Bool值:isHidden

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

image.png

       在swift 3中提供了#keypath()来省去开发者直接输入字符串的尴尬。
        然而,如果这个属性是isHidden的话运行起来就会报错。

image.png

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

        提示我们没有isHidden这个属性。
        那为什么我们平时没有注意到这个问题呢?

image.png

        这么写代码是没问题的。
        其实就是Swift团队在升级3.0的时候keypath忘记做这个功能了。。。

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

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

image.png

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

image.png

    Enum

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

image.png

        错误提示的无效的参数类型。
        因为setValue的参数类型是Any,所以这里参数可以是任意类型,没有类型检查。但是这毕竟是一个OC的方法,所以无法直接使用swift的类型(其实String到NSString也是有转换的,只是编译器帮我们做了这层转换)。
        前面直接赋值的时候是正常的,但是调用KVC方法的时候编译器没有帮我们转。所以这里报错了。
        那就只能自己手动转换了:

image.png

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

收藏(0)0
查看评分情况

全部评分

此主贴暂时没有点赞评分

总计:0

回复分享

共有1条评论

  • MK
  • 药师
  • 慧星的那一夜
  • Mr ken
  • YUI
  • cappuccino
  • mr jack
  • IT宅男
  • 选择版块:

  • 标题:

  • 内容

  • 验证码:

  • 标题:

  • 内容

  • 选择版块:

移动帖子x

移动到: