在swift中使用KVC遇到的坑

  1. 在Swift4.0之后,類必須要繼承自NSObject,同時(shí)還需要在屬性前面加上@objc
    否則會(huì)報(bào)錯(cuò)
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<test3.Person 0x600000449880> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.'
  1. Cannot convert value of type '[String : String]' to expected argument type '[String : AnyObject]'
    實(shí)例代碼:
import UIKit

class Person:NSObject{
    @objc var name:String?

    init(dict:[String:AnyObject]) {
        super.init()
        setValuesForKeys(dict)
    }
}
class ViewController: UIViewController{
    override func viewDidLoad() {
        super.viewDidLoad()
        let dict = ["name":"1234"]
        let p1 = Person(dict: dict)
        print("\(p1.name!)")
    }
}

因?yàn)槲椰F(xiàn)在在學(xué)習(xí)swift,這段代碼我是參考網(wǎng)上的代碼寫(xiě)的,寫(xiě)出來(lái)后一直報(bào)錯(cuò),我也不知道怎么辦
后來(lái)發(fā)現(xiàn)是swift的類型變嚴(yán)格了,于是就有下面兩種方法

import UIKit

class Person:NSObject{
    @objc var name:String?

    init(dict:[String:Any]) {
        super.init()
        setValuesForKeys(dict)
    }
}
class ViewController: UIViewController{
    override func viewDidLoad() {
        super.viewDidLoad()
        let dict = ["name":"1234"]
        let p1 = Person(dict: dict)
        print("\(p1.name!)")
    }
}
import UIKit

class Person:NSObject{
    @objc var name:String?

    init(dict:[String:AnyObject]) {
        super.init()
        setValuesForKeys(dict)
    }
}
class ViewController: UIViewController{
    override func viewDidLoad() {
        super.viewDidLoad()
        let dict = ["name":"1234" as AnyObject]
        let p1 = Person(dict: dict)
        print("\(p1.name!)")
    }
}

如果有什么寫(xiě)的不好的地方,希望大家評(píng)論區(qū)告訴我,畢竟我也才學(xué)swift,很多地方都不懂

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容