中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

四川網(wǎng)站建設(shè)套餐友情鏈接交易網(wǎng)

四川網(wǎng)站建設(shè)套餐,友情鏈接交易網(wǎng),做網(wǎng)站用什么軟件編輯,wordpress 小工具 不顯示不出來KVC KVC意思是鍵值編碼,是一種可以通過鍵名來訪問對象屬性的機(jī)制,也可以對屬性進(jìn)行賦值,包括私有屬性,由于KVC的定義是對OC中的NSObject的擴(kuò)展進(jìn)行實(shí)現(xiàn)的,所以如果要使用KVC機(jī)制,那么這個類需要繼承NSObje…

KVC

KVC意思是鍵值編碼,是一種可以通過鍵名來訪問對象屬性的機(jī)制,也可以對屬性進(jìn)行賦值,包括私有屬性,由于KVC的定義是對OC中的NSObject的擴(kuò)展進(jìn)行實(shí)現(xiàn)的,所以如果要使用KVC機(jī)制,那么這個類需要繼承NSObject,同時屬性需添加@objc關(guān)鍵字。如圖:

class Person:NSObject{@objc var name:String{set{_name = newValueprint("name被賦值了")}get{print("name被訪問了")return _name}}@objc var age:Intinit(age: Int) {self.age = age}var _name = ""
}

在上面的示例中,name和age變量的用了@objc修飾,所以可以通過KVC機(jī)制對這兩個變量進(jìn)行讀寫,而_name沒有@objc關(guān)鍵字修飾,則不能通過KVC機(jī)制進(jìn)行讀寫。

使用KVC機(jī)制進(jìn)行讀寫訪問:

let p = Person(age: 20)
p.setValue("Ally", forKey: "name")//使用KVC進(jìn)行賦值操作
let pName = p.value(forKey: "name") as! String//使用KVC進(jìn)行訪問操作
print(pName)

在使用KVC對計(jì)算屬性(上面示例中的name屬性)進(jìn)行讀寫操作時,會分別調(diào)用屬性的getter和setter方法。

執(zhí)行結(jié)果如圖:

補(bǔ)充:

計(jì)算屬性:在Swift中,計(jì)算屬性不直接存儲值,而是提供一個 getter 和一個可選的 setter 來間接獲取和設(shè)置其他屬性的值。計(jì)算屬性可以不需要初始化,因?yàn)橛?jì)算屬性并不會占用內(nèi)存。

KVC機(jī)制和.語法的區(qū)別:

我們知道,對類的屬性進(jìn)行讀寫時,可以創(chuàng)建對象,然后通過.語法對屬性進(jìn)行讀寫操作,那么兩者的區(qū)別是什么呢?

對于KVC機(jī)制,它是在運(yùn)行時才會檢查錯誤,比如訪問某個不存在的屬性安全性較低,而點(diǎn)語法在編譯時會進(jìn)行類型檢查,同時.語法不能訪問或修改私有成員變量,而KVC機(jī)制可以。

KVC賦值和取值的原理:

賦值:

  • 優(yōu)先查找set<Key>方法或_set<Key>的第一個訪問器。找到則直接完成。
  • 如果沒有找到訪問器,則會檢查類方法accessInstanceVariablesDirectly是否為YES,如果是YES則會查找名稱為_< key >、_is< key >、< key >或is< key >的實(shí)例變量,。如果找到,則直接完成。
  • 如果沒有訪問器或?qū)嵗兞繒r,調(diào)用setValue:forUndefinedKey:。這將在默認(rèn)情況下引發(fā)異常。

取值

首先查找get<Key><Key>、is<Key>或_<Key>的方法,找到則直接調(diào)用。???????

如果都沒找到,KVC則會查找countOf<Key>,objectIn<Key>AtIndex<Key>AtIndexes格式的方法。如果countOf<Key>方法和另外兩個方法中的一個被找到,那么就會返回一個可以響應(yīng)NSArray所有方法的代理集合(它是NSKeyValueArray,是NSArray的子類),調(diào)用這個代理集合的方法,或者說給這個代理集合發(fā)送屬于NSArray的方法,就會以countOf<Key>,objectIn<Key>AtIndex<Key>AtIndexes這幾個方法組合的形式調(diào)用。還有一個可選的get<Key>:range:方法。所以你想重新定義KVC的一些功能,你可以添加這些方法,需要注意的是你的方法名要符合KVC的標(biāo)準(zhǔn)命名方法,包括方法簽名。

如果上面的方法沒有找到,那么會同時查找countOf<Key>enumeratorOf<Key>,memberOf<Key>格式的方法。如果這三個方法都找到,那么就返回一個可以響應(yīng)NSSet所的方法的代理集合,和上面一樣,給這個代理集合發(fā)NSSet的消息,就會以countOf<Key>enumeratorOf<Key>,memberOf<Key>組合的形式調(diào)用。

如果還沒有找到,再檢查類方法+ (BOOL)accessInstanceVariablesDirectly,如果返回YES(默認(rèn)行為),那么和先前的設(shè)值一樣,會按_<key>,_is<Key>,<key>,is<Key>的順序搜索成員變量名。如果重寫了類方法+ (BOOL)accessInstanceVariablesDirectly返回NO的話,那么會直接調(diào)用valueForUndefinedKey:

還沒有找到的話,調(diào)用valueForUndefinedKey:

KVC在實(shí)際應(yīng)用中可以字典轉(zhuǎn)模型,如:

let p = Person(age: 20)
let dict = ["name":"BBB","age":30,"_name":"_name"] as [String : Any]p.setValuesForKeys(dict)
print(p.name)
print(p.age)
print(p._name)

運(yùn)行結(jié)果:

KVO

KVO意思是鍵值觀察,是基于KVC以及動態(tài)派發(fā)技術(shù)實(shí)現(xiàn)的,它是觀察者模式的一種衍生,其思想是:當(dāng)被觀察對象的某個屬性發(fā)生變化時,另一個類可以通過觀察獲取通知,并做出處理。

KVO是對NSObject的擴(kuò)展來實(shí)現(xiàn)的,當(dāng)使用KVO時,需要繼承NSObject,并且觀察屬性需要添加@objc dynamic標(biāo)識,如:


class Person:NSObject{@objc dynamic var name:String{set{_name = newValueprint("name被賦值了")}get{print("name被訪問了")return _name}}@objc var age:Intinit(age: Int) {self.age = age}@objc var _name = ""deinit {removeObserver(self, forKeyPath: "name")}}

注意:observer對資源消耗大,建議在類銷毀的時候移除觀察者,如上示例中的析構(gòu)deinit()中.

接著我們定義一個Model(B類),負(fù)責(zé)監(jiān)聽A類中的屬性name,如:

class Model:NSObject{let p2 = Person(age: 30)override init(){super.init()p2.addObserver(self as! NSObject, forKeyPath: "name", options: .new, context: nil)}//響應(yīng)回調(diào)事件的重寫,需要繼承NSObjectoverride func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {print(22)if p2.name != ""{print("p2`s name is changed,is \(p2.name)")}}}

??????????????注意:你需要繼承NSObject類,從而對響應(yīng)回調(diào)事件進(jìn)行重寫。

接著我們創(chuàng)建實(shí)例,修改p2的name值:

let model = Model()
model.p2.name = "good"

當(dāng)p2.name值被修改后,會調(diào)用響應(yīng)事件,運(yùn)行結(jié)果如下:

KVO在iOS實(shí)際開發(fā)中的舉例:

import UIKit
import Foundationclass Persons:NSObject {@objc dynamic var name: String?init(name: String? = nil) {self.name = name}
}class ViewController: UIViewController {//實(shí)例化被觀察對象var person = Persons(name: "Aliy")override func viewDidLoad() {super.viewDidLoad()self.view.backgroundColor = .red//添加觀察者self.person.addObserver(self, forKeyPath: "name", options: .new, context: nil)//3s后執(zhí)行被觀察對象值的改變self.perform(#selector(ChangeName), with: nil, afterDelay: 3.0)}override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {if person.name != "" {print("The new person is \(person.name!)")self.view.backgroundColor = . green}}}extension ViewController {@objc func ChangeName(){person.name = "John"}
}

這里注意:ViewController不需要再去繼承NSObject類,因?yàn)樗呀?jīng)繼承了UIViewController,而Swift 中的?UIViewController?繼承自?UIResponder,而?UIResponder繼承自?NSObject?類。

http://www.risenshineclean.com/news/29517.html

相關(guān)文章:

  • 網(wǎng)頁設(shè)計(jì)圖片簡單seo網(wǎng)站推廣排名
  • 深圳鼎晟展覽設(shè)計(jì)有限公司廣州王牌seo
  • 中國網(wǎng)頁設(shè)計(jì)師網(wǎng)站代運(yùn)營靠譜嗎
  • 銷售員做網(wǎng)站常德網(wǎng)站seo
  • 速賣通網(wǎng)站怎么做推廣seo具體優(yōu)化流程
  • 定制網(wǎng)站建設(shè)公司怎么在百度上發(fā)布廣告
  • 做網(wǎng)站造假國內(nèi)免費(fèi)推廣產(chǎn)品的網(wǎng)站
  • 和網(wǎng)站建設(shè)簽合同2020 惠州seo服務(wù)
  • 360網(wǎng)站賣東西怎么做搜索引擎優(yōu)化seo培訓(xùn)
  • 做企業(yè)網(wǎng)站必須要座機(jī)嗎聯(lián)盟營銷平臺
  • 跨境電商獨(dú)立站運(yùn)營百度一下的網(wǎng)址
  • 深圳制作網(wǎng)站培訓(xùn)學(xué)校陜西seo快速排名
  • 網(wǎng)站開發(fā)網(wǎng)站設(shè)計(jì)案例免費(fèi)推廣工具有哪些
  • 網(wǎng)站用哪些系統(tǒng)做的比較好用如何網(wǎng)站推廣
  • 事件營銷方案模板寧波seo外包公司
  • 網(wǎng)站建設(shè)新趨勢國內(nèi)新聞大事
  • 樹形菜單的網(wǎng)站代碼網(wǎng)絡(luò)運(yùn)營推廣具體做什么工作
  • 做門戶類網(wǎng)站報價上海疫情又要爆發(fā)了
  • 網(wǎng)站服務(wù)器租用有什么好學(xué)大教育一對一收費(fèi)價格表
  • 郴州企業(yè)網(wǎng)站建設(shè)制作營銷案例100例
  • 網(wǎng)站建站建設(shè)網(wǎng)站中國企業(yè)500強(qiáng)排行榜
  • a0000網(wǎng)站建設(shè)2022年seo最新優(yōu)化策略
  • 博山網(wǎng)站建設(shè)網(wǎng)頁制作基礎(chǔ)教程
  • 四川城鄉(xiāng)住房建設(shè)廳官方網(wǎng)站seo搜索優(yōu)化公司排名
  • 新華社官網(wǎng)百度推廣怎么優(yōu)化
  • 深圳平湖網(wǎng)站建設(shè)有免費(fèi)推廣平臺
  • 東莞網(wǎng)站推廣優(yōu)化建設(shè)seo站長工具
  • 吳橋縣網(wǎng)站建設(shè)價格沈陽頭條今日頭條新聞最新消息
  • 網(wǎng)站做分站360收錄批量查詢
  • 多少網(wǎng)站域名采用中文四川全網(wǎng)推網(wǎng)絡(luò)推廣