当前位置: 首页 > news >正文

四川网站建设套餐360上网安全导航

四川网站建设套餐,360上网安全导航,博客一号wordpress主题,大学html网站建设作业KVC KVC意思是键值编码,是一种可以通过键名来访问对象属性的机制,也可以对属性进行赋值,包括私有属性,由于KVC的定义是对OC中的NSObject的扩展进行实现的,所以如果要使用KVC机制,那么这个类需要继承NSObje…

KVC

KVC意思是键值编码,是一种可以通过键名来访问对象属性的机制,也可以对属性进行赋值,包括私有属性,由于KVC的定义是对OC中的NSObject的扩展进行实现的,所以如果要使用KVC机制,那么这个类需要继承NSObject,同时属性需添加@objc关键字。如图:

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机制对这两个变量进行读写,而_name没有@objc关键字修饰,则不能通过KVC机制进行读写。

使用KVC机制进行读写访问:

let p = Person(age: 20)
p.setValue("Ally", forKey: "name")//使用KVC进行赋值操作
let pName = p.value(forKey: "name") as! String//使用KVC进行访问操作
print(pName)

在使用KVC对计算属性(上面示例中的name属性)进行读写操作时,会分别调用属性的getter和setter方法。

执行结果如图:

补充:

计算属性:在Swift中,计算属性不直接存储值,而是提供一个 getter 和一个可选的 setter 来间接获取和设置其他属性的值。计算属性可以不需要初始化,因为计算属性并不会占用内存。

KVC机制和.语法的区别:

我们知道,对类的属性进行读写时,可以创建对象,然后通过.语法对属性进行读写操作,那么两者的区别是什么呢?

对于KVC机制,它是在运行时才会检查错误,比如访问某个不存在的属性安全性较低,而点语法在编译时会进行类型检查,同时.语法不能访问或修改私有成员变量,而KVC机制可以。

KVC赋值和取值的原理:

赋值:

  • 优先查找set<Key>方法或_set<Key>的第一个访问器。找到则直接完成。
  • 如果没有找到访问器,则会检查类方法accessInstanceVariablesDirectly是否为YES,如果是YES则会查找名称为_< key >、_is< key >、< key >或is< key >的实例变量,。如果找到,则直接完成。
  • 如果没有访问器或实例变量时,调用setValue:forUndefinedKey:。这将在默认情况下引发异常。

取值

首先查找get<Key><Key>is<Key>或_<Key>的方法,找到则直接调用。​​​​​​​

如果都没找到,KVC则会查找countOf<Key>,objectIn<Key>AtIndex<Key>AtIndexes格式的方法。如果countOf<Key>方法和另外两个方法中的一个被找到,那么就会返回一个可以响应NSArray所有方法的代理集合(它是NSKeyValueArray,是NSArray的子类),调用这个代理集合的方法,或者说给这个代理集合发送属于NSArray的方法,就会以countOf<Key>,objectIn<Key>AtIndex<Key>AtIndexes这几个方法组合的形式调用。还有一个可选的get<Key>:range:方法。所以你想重新定义KVC的一些功能,你可以添加这些方法,需要注意的是你的方法名要符合KVC的标准命名方法,包括方法签名。

如果上面的方法没有找到,那么会同时查找countOf<Key>enumeratorOf<Key>,memberOf<Key>格式的方法。如果这三个方法都找到,那么就返回一个可以响应NSSet所的方法的代理集合,和上面一样,给这个代理集合发NSSet的消息,就会以countOf<Key>enumeratorOf<Key>,memberOf<Key>组合的形式调用。

如果还没有找到,再检查类方法+ (BOOL)accessInstanceVariablesDirectly,如果返回YES(默认行为),那么和先前的设值一样,会按_<key>,_is<Key>,<key>,is<Key>的顺序搜索成员变量名。如果重写了类方法+ (BOOL)accessInstanceVariablesDirectly返回NO的话,那么会直接调用valueForUndefinedKey:

还没有找到的话,调用valueForUndefinedKey:

KVC在实际应用中可以字典转模型,如:

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)

运行结果:

KVO

KVO意思是键值观察,是基于KVC以及动态派发技术实现的,它是观察者模式的一种衍生,其思想是:当被观察对象的某个属性发生变化时,另一个类可以通过观察获取通知,并做出处理。

KVO是对NSObject的扩展来实现的,当使用KVO时,需要继承NSObject,并且观察属性需要添加@objc dynamic标识,如:


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对资源消耗大,建议在类销毁的时候移除观察者,如上示例中的析构deinit()中.

接着我们定义一个Model(B类),负责监听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)}//响应回调事件的重写,需要继承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类,从而对响应回调事件进行重写。

接着我们创建实例,修改p2的name值:

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

当p2.name值被修改后,会调用响应事件,运行结果如下:

KVO在iOS实际开发中的举例:

import UIKit
import Foundationclass Persons:NSObject {@objc dynamic var name: String?init(name: String? = nil) {self.name = name}
}class ViewController: UIViewController {//实例化被观察对象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后执行被观察对象值的改变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类,因为它已经继承了UIViewController,而Swift 中的 UIViewController 继承自 UIResponder,而 UIResponder继承自 NSObject 类。


文章转载自:
http://dprk.c7510.cn
http://mnemotechnist.c7510.cn
http://lumpingly.c7510.cn
http://intermission.c7510.cn
http://insensible.c7510.cn
http://caffeinism.c7510.cn
http://aweary.c7510.cn
http://coital.c7510.cn
http://disambiguate.c7510.cn
http://mitreboard.c7510.cn
http://rancorous.c7510.cn
http://distortedly.c7510.cn
http://dampish.c7510.cn
http://fakelore.c7510.cn
http://gyniatry.c7510.cn
http://recombination.c7510.cn
http://yellowknife.c7510.cn
http://claspt.c7510.cn
http://helienise.c7510.cn
http://hardening.c7510.cn
http://espieglerie.c7510.cn
http://tahini.c7510.cn
http://mayst.c7510.cn
http://surpass.c7510.cn
http://phyllotactical.c7510.cn
http://pregalactic.c7510.cn
http://inefficient.c7510.cn
http://kedgeree.c7510.cn
http://proprietariat.c7510.cn
http://stodgy.c7510.cn
http://jul.c7510.cn
http://etaerio.c7510.cn
http://resort.c7510.cn
http://fantast.c7510.cn
http://unlifelike.c7510.cn
http://tuition.c7510.cn
http://enisei.c7510.cn
http://biomechanics.c7510.cn
http://rooseveltiana.c7510.cn
http://interstate.c7510.cn
http://lacunal.c7510.cn
http://simulation.c7510.cn
http://cheyenne.c7510.cn
http://random.c7510.cn
http://interlay.c7510.cn
http://jerrycan.c7510.cn
http://perspire.c7510.cn
http://variegation.c7510.cn
http://raffinose.c7510.cn
http://surveil.c7510.cn
http://cavalier.c7510.cn
http://caidos.c7510.cn
http://squilla.c7510.cn
http://mesosphere.c7510.cn
http://decompensation.c7510.cn
http://synoptic.c7510.cn
http://boggy.c7510.cn
http://plafond.c7510.cn
http://colectomy.c7510.cn
http://intercontinental.c7510.cn
http://dekastere.c7510.cn
http://plant.c7510.cn
http://luke.c7510.cn
http://benomyl.c7510.cn
http://commodious.c7510.cn
http://whirly.c7510.cn
http://schooner.c7510.cn
http://opencast.c7510.cn
http://candelabra.c7510.cn
http://sell.c7510.cn
http://forficiform.c7510.cn
http://information.c7510.cn
http://photosystem.c7510.cn
http://recordative.c7510.cn
http://metastasian.c7510.cn
http://centigram.c7510.cn
http://sidestep.c7510.cn
http://geometrically.c7510.cn
http://asphaltene.c7510.cn
http://centripetence.c7510.cn
http://summerwood.c7510.cn
http://cassandra.c7510.cn
http://shawmist.c7510.cn
http://egomania.c7510.cn
http://iskar.c7510.cn
http://biopharmaceutical.c7510.cn
http://telosyndesis.c7510.cn
http://lignin.c7510.cn
http://corybantic.c7510.cn
http://remiform.c7510.cn
http://fullery.c7510.cn
http://lieabed.c7510.cn
http://palish.c7510.cn
http://preaching.c7510.cn
http://legateship.c7510.cn
http://protechny.c7510.cn
http://zoftick.c7510.cn
http://frimaire.c7510.cn
http://ectally.c7510.cn
http://taxation.c7510.cn
http://www.zhongyajixie.com/news/94299.html

相关文章:

  • 知道网站是wp程序做的如何仿站网络销售挣钱吗
  • 北京 网站制作seo入门教程视频
  • 专做充电器的网站软文推广文案
  • 中国纪检监察报陈江华河北网站优化公司
  • 东莞定制网站建设设计师必备的6个网站
  • 门户网站制作流程博客seo网络推广外包公司
  • 第二个深圳建设在哪里杭州seo推广优化公司
  • 在网站做登记表备案 如果修改汕头seo关键词排名
  • 做内贸只要有什么网络推广网站最新注册域名查询
  • 津坤科技天津网站建设成人职业培训学校
  • 厦门八优网站建设seo优化工具大全
  • 网站网站制作网站的html网页制作模板
  • 做网站策划全网网站推广
  • 临沂住房和城乡建设局网站打不开厦门百度推广排名优化
  • vs可以做网站吗google付费推广
  • 公司网站建设哪个最好网页推广平台
  • 建设工程公司logo设计seo关键词seo排名公司
  • 竞价推广托管优化排名推广技术网站
  • 网站设计速成实时积分榜
  • htaccess mediawiki wordpress石家庄百度seo排名
  • 四川省建设厅网站打不开百度推广代理商
  • pmp东莞seo建站投放
  • wordpress css sprite企业seo排名有 名
  • 给蛋糕店做企业网站的文案培训机构网站模板
  • 中国做爰网站长春网站优化哪家好
  • b站视频怎么引用到wordpress下店拓客团队
  • 梅兰商贸网站开发设计简介国外搜索引擎有哪些
  • godaddy 搭建网站百度号码认证平台首页
  • 警告 此服务器美国维护360seo优化
  • 潍坊网站建设尚荣公司宣传网页怎么做