原因是最近看了@南峰子_老勒写的ViewStyle。用KVC简化提取控件设置样式的代码,想实现css效果。这个库是用swift编写的,它的工作原理是这样的:.view.addSubview(tableView!)}}//MARK:-TableViewStyleextensionViewController{vartableViewStyle:[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有些不同。boolvalue:isHidden首先看swift中正常的kvc例程:letview=UIView(frame:CGRect(x:0,y:0,width:100,height:100))view.setValue(UIColor.blue,forKey:#keyPath(UIView.backgroundColor))在swift3中提供了#keypath(),让开发者免去直接输入字符串的尴尬。但是如果这个属性是isHidden,运行的时候会报错。控制台会输出错误:‘[setValue:forUndefinedKey:]:thisclassisnotkeyvaluecoding-compliantforthekeyisHidden.’提示我们没有isHidden属性。那么为什么我们通常没有注意到这个问题呢?像view.isHidden=true这样写代码是没有问题的。事实上,当Swift团队升级到3.0时,keypath忘了做这个功能。..你可以安慰自己,这个特性在swift2.0中还是没问题的。如果读者写过OC,原因很容易猜到。有些单独声明了getter的bool值会直接报错给kvc。例如,isHidden:@property(nonatomic,getter=isHidden)BOOLhidden;UIView上没有isHidden属性,怎么解决呢?只能回到老办法:view.setValue(true,forKey:"Hidden")EnumKVC在设置枚举的时候也会报错。错误消息的参数类型无效。因为setValue的参数类型是Any,所以这里的参数可以是任意类型,不需要类型检查。但是这毕竟是OC的方法,所以不能直接使用swift类型(其实也有String到NSString的转换,只是编译器帮我们做了这个转换)。之前直接赋值的时候是正常的,但是编译器在调用KVC方法的时候并没有帮我们。所以这是一个错误。那只能手动转换了:view.setValue(UIViewTintAdjustmentMode.automatic.rawValue,forKey:"tintAdjustmentMode")OC中的枚举其实对应了几个值,这里直接把rawValue的值取出来就可以正常使用了。***有句话想对swift说:
