Swift4.0 KVC 字典賦值模型改變
我們都知道KVC 是OC NSobject特有的,之前在Swift4.0之前,繼承NSobject的物件,可用動態的拿到字典呼叫KVC給模型賦值。只是比較省事的操作,有沒有定義屬性,只要從寫UndefinedKey這個屬性即可。
還是用程式碼演示比如下面一個物件,從字典賦值
//
// UserAccount.swift
// WeiBo
//
// Created by 張宇 on 2018/2/6.
// Copyright © 2018年 張宇. All rights reserved.
//
//
// 使用者賬號Model
//
import UIKit
class UserAccount: NSObject {
//MARK : 儲存屬性
var access_token:String = ""
var expires_in:TimeInterval = 0.0
var uid:String?
init(dict:[String:Any]){
super.init()
setValuesForKeys(dict)
}
override func setValue(_ value: Any?, forUndefinedKey key: String) {
}
override var description: String{
return dictionaryWithValues(forKeys: ["access_token","expires_in","uid"]).description
}
}
3.0這樣寫肯定是沒有錯誤的,但是4.0的時候你就會發現一個問題forUndefinedKey這個方法每次都會呼叫,然後就崩潰了。
猜測原因:這是因為KVC是OC 的方法,OC方法和屬性都需要執行時寫到類物件中,swift 利用KVC設定屬性需要執行時機制,swift4.0以前,編譯器預設幫我們做了在物件宣告前加上了@objc,4.0需要手動加上。
//MARK : 儲存屬性
@objc var access_token:String = ""
@objc var expires_in:TimeInterval = 0.0
@objc var uid:String?
這樣就不會報錯了。
相關文章
- vue 變數賦值同時改變的問題Vue變數賦值
- php之普通變數賦值、物件賦值、引用賦值的區別PHP變數賦值物件
- 變數的賦值 指標間接賦值變數賦值指標
- python中的字典賦值操作怎麼實現?Python賦值
- shell變數命名與賦值變數賦值
- 變數的解構賦值變數賦值
- shell 變數賦值問題變數賦值
- 物件屬性值賦給變數物件變數
- Java之StringBuffer可變字串(值可以改變)Java字串
- iOS開發·runtime+KVC實現多層字典模型轉換(多層資料:模型巢狀模型,模型巢狀陣列,陣列巢狀模型)iOS模型巢狀陣列
- c#小灶——常量、變數和賦值C#變數賦值
- AC-DMIS 5.3 V變數賦值變數賦值
- Java記憶體模型FAQ(八)Final欄位如何改變它們的值Java記憶體模型
- Javascript 解構賦值,將屬性/值從物件/陣列中取出,賦值給其他變數JavaScript賦值物件陣列變數
- 2.7.6 改變初始化引數值
- go語言變數的宣告與賦值Go變數賦值
- 複製物件重新賦值不改變原物件物件賦值
- 列表切片賦值給另一個變數賦值變數
- JS中的變數賦值深入理解JS變數賦值
- 自己對Java中if變數賦值的理解Java變數賦值
- ES6:變數的結構賦值變數賦值
- MySQL中變數的定義和變數的賦值使用MySql變數賦值
- js 改變 控制元件的屬性值JS控制元件
- 【layui】 laydate動態改變日期最小值UI
- ES6 - 變數的解構賦值解析變數賦值
- JavaScript 同時宣告多個變數並賦值JavaScript變數賦值
- 淺談Python變數賦值的三種方法!Python變數賦值
- ECMAScript 6入門 - 變數的解構賦值變數賦值
- ES6之變數的解構賦值變數賦值
- matlab中怎麼給符號變數賦值Matlab符號變數賦值
- 動態監控input的值的變化 賦值value觸發賦值
- 字典的增刪改查
- Verilog連續賦值、過程賦值、過程連續賦值總結賦值
- KVC
- 關於變數與‘=’賦值的情況出錯變數賦值
- ES6 -- 變數的解構賦值的用途變數賦值
- 深入ES6 三 變數的解構賦值變數賦值
- python改變單通道圖片的畫素值Python
- select通過onchange獲取每次改變的值