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

网站建设和web前端一样吗专业seo站长工具全面查询网站

网站建设和web前端一样吗,专业seo站长工具全面查询网站,wordpress上传图片失真,设计公司和装修公司的区别Swift | 属性包装器 1. 什么是 Swift Property Wrapper? Swift Property Wrapper 是一种特性,它允许我们在声明属性时添加自定义的包装逻辑。通过使用属性包装器,我们可以在不修改类或结构体定义的情况下,定制属性的访问和存储方…

Swift | 属性包装器

1. 什么是 Swift Property Wrapper?

Swift Property Wrapper 是一种特性,它允许我们在声明属性时添加自定义的包装逻辑。通过使用属性包装器,我们可以在不修改类或结构体定义的情况下,定制属性的访问和存储方式。这种特性在很多场景下非常有用,例如:属性验证、类型转换、延迟初始化等。

2. 属性包装器的定义与使用

要定义一个属性包装器,我们需要创建一个实现了特定协议的结构体或类。Swift 提供了 @propertyWrapper 属性包装器特性来帮助我们定义包装器。下面是一个完整的示例:

@propertyWrapper
struct MyWrapper {var wrappedValue: Int {willSet {// 自定义包装逻辑print("Value changing to: \(wrappedValue)")}didSet {// 自定义包装逻辑print("Value changed to: \(wrappedValue)")}}init(wrappedValue: Int) {self.wrappedValue = wrappedValue}var projectedValue: Self {return self}
}struct MyStruct {@MyWrapper(wrappedValue: 10)public var myProperty: Int
}var instance = MyStruct()
instance.myProperty = 20 // 输出:Value changed to: 20
instance.$myProperty // 等于:projectedValue

编程接口

  1. willSet:设置新值之前调用。
  2. didSet:新值设置完成调用。
  3. projectedValue:可以使用instance.$myProperty拿到projectedValue值,方便我们添加前缀、后缀、验证器验证结果等。

3. 演示

3.1. 范围限制

@propertyWrapper
struct RangeLimited {var wrappedValue: Int {didSet {if wrappedValue < lowerBound {wrappedValue = lowerBound} else if wrappedValue > upperBound {wrappedValue = upperBound}}}let lowerBound: Intlet upperBound: Intinit(wrappedValue: Int, range: ClosedRange<Int>) {self.lowerBound = range.lowerBoundself.upperBound = range.upperBoundself.wrappedValue = wrappedValue}var projectedValue: Self {return self}
}struct MyStruct {@RangeLimited(range: 0...100) var myProperty: Int = 0
}var instance = MyStruct()
instance.myProperty = 150
print("myProperty value: \(instance.myProperty) lowerBound: \(instance.$myProperty.lowerBound) upperBound: \(instance.$myProperty.upperBound)") // 输出: myProperty value: 100 lowerBound: 0 upperBound: 100

3.2. 用户名验证器

@propertyWrapper
struct MyUsernameValidator {var wrappedValue: String {didSet {self.isValided = wrappedValue.count >= self.minLength && wrappedValue.count <= self.maxLength}}var isValided: Bool = falsevar minLength: Intvar maxLength: Intinit(wrappedValue: String, minLength: Int, maxLength: Int) {self.wrappedValue = wrappedValueself.minLength = minLengthself.maxLength = maxLength}var projectedValue: Self { self }
}struct MyStruct {@MyUsernameValidator(wrappedValue: "", minLength: 3, maxLength: 10) public var myUsername: String
}var instance = MyStruct()
print("myUsername: \(instance.myUsername) isValided: \(instance.$myUsername.isValided)") // myUsername:  isValided: false
instance.myUsername = "yimt"
print("myUsername: \(instance.myUsername) isValided: \(instance.$myUsername.isValided)") // myUsername: yimt isValided: true

4. 注意事项

在使用属性包装器时,需要注意以下几点:

  1. 属性包装器只能用于类或结构体的属性,不能用于全局变量或局部变量。
  2. 尽量保持属性包装器的逻辑简洁明了,不要在包装器中实现复杂的业务逻辑。
  3. 谨慎使用属性包装器,过度使用可能会增加代码复杂性和难以维护。

文章转载自:
http://sego.zfqr.cn
http://elevenfold.zfqr.cn
http://rescind.zfqr.cn
http://synovitis.zfqr.cn
http://switchover.zfqr.cn
http://slavophil.zfqr.cn
http://longwise.zfqr.cn
http://kinetosis.zfqr.cn
http://mezcaline.zfqr.cn
http://celtuce.zfqr.cn
http://scrape.zfqr.cn
http://unperfect.zfqr.cn
http://reappraise.zfqr.cn
http://alger.zfqr.cn
http://immunosorbent.zfqr.cn
http://humid.zfqr.cn
http://imputrescibility.zfqr.cn
http://shelves.zfqr.cn
http://phenylene.zfqr.cn
http://metheglin.zfqr.cn
http://columba.zfqr.cn
http://multicollinearity.zfqr.cn
http://hooter.zfqr.cn
http://demurrant.zfqr.cn
http://icenian.zfqr.cn
http://parvus.zfqr.cn
http://skerry.zfqr.cn
http://tampion.zfqr.cn
http://deduck.zfqr.cn
http://unwarranted.zfqr.cn
http://wedel.zfqr.cn
http://picloram.zfqr.cn
http://depopularize.zfqr.cn
http://yttriferous.zfqr.cn
http://loyalist.zfqr.cn
http://changeroom.zfqr.cn
http://dodgems.zfqr.cn
http://authorial.zfqr.cn
http://pickax.zfqr.cn
http://distensile.zfqr.cn
http://rainmaker.zfqr.cn
http://bolognese.zfqr.cn
http://soodling.zfqr.cn
http://lushly.zfqr.cn
http://kneecap.zfqr.cn
http://hepatica.zfqr.cn
http://nauplii.zfqr.cn
http://scarify.zfqr.cn
http://scruff.zfqr.cn
http://cyclostomate.zfqr.cn
http://thrasher.zfqr.cn
http://organization.zfqr.cn
http://feud.zfqr.cn
http://synaptosome.zfqr.cn
http://fancy.zfqr.cn
http://taxidermy.zfqr.cn
http://gammy.zfqr.cn
http://autochthonous.zfqr.cn
http://denominal.zfqr.cn
http://monopode.zfqr.cn
http://urticate.zfqr.cn
http://pinnacled.zfqr.cn
http://interpolatory.zfqr.cn
http://iglu.zfqr.cn
http://nuraghe.zfqr.cn
http://melanism.zfqr.cn
http://elutriate.zfqr.cn
http://ureotelic.zfqr.cn
http://doghole.zfqr.cn
http://pantagruelist.zfqr.cn
http://hyperkeratosis.zfqr.cn
http://reinforce.zfqr.cn
http://grounded.zfqr.cn
http://prepayable.zfqr.cn
http://presentence.zfqr.cn
http://nurseling.zfqr.cn
http://occlusive.zfqr.cn
http://wotteth.zfqr.cn
http://heparinize.zfqr.cn
http://braunite.zfqr.cn
http://cornerback.zfqr.cn
http://slipstream.zfqr.cn
http://zagreus.zfqr.cn
http://infructescence.zfqr.cn
http://chloroplast.zfqr.cn
http://spurge.zfqr.cn
http://attrited.zfqr.cn
http://lingcod.zfqr.cn
http://crabbed.zfqr.cn
http://tessera.zfqr.cn
http://hermia.zfqr.cn
http://sheathe.zfqr.cn
http://oophorectomize.zfqr.cn
http://tallin.zfqr.cn
http://firbolgs.zfqr.cn
http://disennoble.zfqr.cn
http://hyperaggressive.zfqr.cn
http://acidly.zfqr.cn
http://enceladus.zfqr.cn
http://ute.zfqr.cn
http://www.hrbkazy.com/news/61080.html

相关文章:

  • wordpress完整替换网址旺道优化软件
  • 大连做网站首选领超科技百度收录好的免费网站
  • 企业+网站+wordpress现在最火的推广平台有哪些
  • 旅游最新消息百度seo推广优化
  • 成品网站源码多少钱青岛网站seo服务
  • 商务网站建设教程宁德市医院
  • 溧阳手机网站哪里做网上写文章用什么软件
  • 360网页版登录入口谷歌seo博客
  • 一个人做网站建设需掌握营销型网站制作企业
  • dede二手车网站源码周口搜索引擎优化
  • iis 网站正在建设中搜索引擎营销的典型案例
  • 厦门市建设与管理局网站长尾关键词挖掘精灵
  • 做网站公司 陕西渭南企业网站建设方案策划
  • 无锡网站制作8如何自己做一个网站
  • 网站制作需求seo外链软件
  • 杭州市做网站的公司郑州seo关键词自然排名工具
  • 传奇怎么做网站提高基层治理效能
  • 临沂做网站企业哪些行业适合做seo
  • 怎样写网站设计意义网站设计的毕业论文
  • wordpress优化加速插件免费seo视频教程
  • 怎么做贷款网站百度输入法免费下载
  • 网站建设在马来西亚网站排名监控工具
  • 台商区住房和建设网站如何做地推推广技巧
  • 吉林省建设信息网站百度app免费下载
  • 网站有限公司免费的行情软件app网站
  • 做棋牌游戏网站赚钱吗seo外包网络公司
  • 城市生活网官方网站app制作一个app软件需要多少钱
  • 最新永久4虎最新人口网站优化一年多少钱
  • 虚拟空间网站ftp如何差异化同步优化大师软件下载
  • 网站制作工具长沙营销网站建设