Bug:Swift 5 @objc使用场景

360 阅读2分钟

@objc:使用场景收集:

1、消息机制

今天遇到的一个description问题

点击时间的 响应方法 selector

2、KVC赋值属性

今天正好遇到了一个KVC问题,一个description问题

写一下加强一下印象

代码:

class Emoticon: NSObject {
    /// 发送给服务器的表情字符串
    @objc var chs: String?
    /// 在本地显示的图片名称 + 表情包路径
    @objc var png: String?
    /// emoji 的字符串编码
    @objc var code: String?
    
    init(dict: [String: AnyObject]) {
        super.init()
        setValuesForKeys(dict)
    }

    override var description: String {
        let keys = ["chs", "png", "code"]
        return dictionaryWithValues(forKeys: keys).description
    }
    override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}
class EmoticonPackage: NSObject {
    /// 表情包所在路径
    @objc var id: String?
    /// 表情包的名称,显示在 toolbar 中
    @objc var group_name_cn: String?
    /// 表情数组 - 能够保证,在使用的时候,数组已经存在,可以直接追加数据
    @objc lazy var emoticons = [Emoticon]()

    init(dict: [String: AnyObject]) {
        super.init()
        // 不会按照顺序调用字典中的 key,不能保证生成 emoticons 数组的时候 id 已经被设置
        // setValuesForKeysWithDictionary(dict)
        id = dict["id"] as? String
        group_name_cn = dict["group_name_cn"] as? String

        // 1. 获得字典的数组
        if let array = dict["emoticons"] as? [[String: AnyObject]] {
            for d in array{
                emoticons.append(Emoticon(dict: d))
            }
            }
        }

    override var description: String {
        let keys = ["id", "group_name_cn", "emoticons"]
        return dictionaryWithValues(forKeys: keys).description
    }
}

OC负责 响应消息

override var description: String {
        let keys = ["id", "group_name_cn", "emoticons"]
        return dictionaryWithValues(forKeys: keys).description
    }

根据相应消息发送通知,需要把所有keys里面涉及到的的变量加上@objc

    /// 表情包所在路径
    @objc var id: String?
    /// 表情包的名称,显示在 toolbar 中
    @objc var group_name_cn: String?
    /// 表情数组 - 能够保证,在使用的时候,数组已经存在,可以直接追加数据
    @objc lazy var emoticons = [Emoticon]()

OC 里面KVC赋值也是特有的,需要给 需要赋值的属性加上@objc

class Emoticon: NSObject {
    /// 发送给服务器的表情字符串
    @objc var chs: String?
    /// 在本地显示的图片名称 + 表情包路径
    @objc var png: String?
    /// emoji 的字符串编码
    @objc var code: String?

    init(dict: [String: AnyObject]) {
        super.init()
        setValuesForKeys(dict)
    }
    override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}