setValuesForKeys() 无法赋值问题

Swift4.0在解析JSON数据时,使用setValuesForKeys()方法出现无法赋值的问题。原因是该版本不再自动添加@objc。解决办法是在需要的地方显式添加@objc或者使用 Coding 协议进行序列化。

问题描述

Swift4.0中,在网络请求到json数据后,进行数据解析,使用setValuesForKeys()进行赋值,明明定义了对应属性,但它还是走
override func setValue(_ value: Any?, forUndefinedKey key: String) {}
这个未定义的方法。

// 错误代码!!!
import UIKit

class NewsModel: NSObject {

    // MARK: - 定义属性
    var replyCount : Int = 0
    var title : String = ""
    var source : String = ""
    var imgsrc : String = ""
    
    // MARK: - 定义构造函数
    init(dict : [String : Any]) {
        super.init()  
        setValuesForKeys(dict)
    }
    override func setValue(_ value: Any?, forUndefinedKey key: String) {}  
}

原因

在swift3中,编译器自动推断@objc,即自动添加@objc
在swift4中,编译器不再自动推断,你必须显式添加@objc

解决办法

// 正确代码!!!
    // MARK: - 定义属性
    @objc var replyCount : Int = 0
    @objc var title : String = ""
    @objc var source : String = ""
    @objc var imgsrc : String = ""

或者

// 正确代码!!!
@objcMembers
class NewsModel: NSObject {

    // MARK: - 定义属性
    var replyCount : Int = 0
    var title : String = ""
    var source : String = ""
    var imgsrc : String = ""
    
   	··· ··· ···
}

参考

Swift4.0 — setValuesForKeys() 无法赋值问题
在swift 4.0中用系统方法setValuesForKeys()赋值问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值