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

淘客网站建设教程免费搭建网站的软件

淘客网站建设教程,免费搭建网站的软件,宿迁明远建设有限公司网站,搜索引擎搜索wordpressSwift | 属性包装器 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://www.dinnco.com/news/57218.html

相关文章:

  • 长春房产网 房小二游戏优化大师下载安装
  • 闵行做网站费用长春网站建设公司哪个好
  • 多语言外贸网站建设网址浏览大全
  • 智慧团建网站密码格式手游推广渠道平台
  • 自己学做网站以服务营销出名的企业
  • 专业做二手房的网站有哪些百度网盘app手机版
  • 网站建设天津短视频怎么赚钱
  • 丹东网站开发目前搜索引擎排名
  • 南京 百度 网站建设推广方案是什么
  • 深圳趣网站建设网站首页推广
  • 烟台制作网站今日深圳新闻最新消息
  • wordpress 家具亚马逊seo关键词优化软件
  • 做网站开发用什么APP好网站排名系统
  • 网站建设SEO优化seo课
  • 网站备案关闭影响排名怎么优化网站排名
  • 网站采用什么字体seo渠道是什么意思
  • 重庆网络营销网站建设销售怎么看百度指数
  • 中国网页游戏排行榜信阳seo
  • 委托做的网站版权归属软文推广渠道主要有
  • 个人微信公共号可以做微网站么十大免费最亏的免费app
  • 常德市做网站的公司自己如何制作一个网站
  • 常用网站网址长春seo公司哪家好
  • 网站建设与推广论文宝鸡网站开发公司
  • 记事本做网站表格网站优化排名操作
  • 程序_做彩票源码网站开发怎么制作网页页面
  • 帝国文章网站模板seo关键词排名点击工具
  • 贵阳商城网站建设北大青鸟
  • 通州网站建设站开发评价网站收录怎么弄
  • 为什么要进行网站备案谷歌搜索入口 镜像
  • 怎么看网站建设有多久品牌宣传推广文案