没想到Swift里KVC还能有坑

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

class ViewController: UIViewController {

    var tableView: UITableView?

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView = UITableView(frame: self.view.bounds)

        tableView!.mi_styles = self.tableViewStyle

        self.view.addSubview(tableView!)
    }
}

// MARK: - Table View Style

extension ViewController {
    var tableViewStyle: [Property: Any] {
        return [
            .rowHeight: 60.0,
            .separatorStyle: UITableViewCellSeparatorStyle.singleLine,
            .separatorColor: UIColor.lightGray,
            .backgroundView: UIView(),
            .separatorInset: UIEdgeInsets(top: 10.0, left: 5.0, bottom: 3.0, right: 10.0),
            .cellLayoutMarginsFollowReadableWidth: true
        ]
    }
}复制代码

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

#Bool值:isHidden
先来看下正常的在swift中kvc的套路:

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view.setValue(UIColor.blue, forKey: #keyPath(UIView.backgroundColor))复制代码

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


控制台会输出错误:

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

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

view.isHidden = true复制代码

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


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

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

@property (nonatomic, getter=isHidden) BOOL hidden;复制代码

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

view.setValue(true, forKey: "Hidden")复制代码

Enum

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


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

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

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


欢迎关注我的微博:@没故事的卓同学

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值