Swift | 属性包装器

Swift自定义属性包装器(property wrapper) //自定义一个汇率转化的修饰语 //案例来自swiftUIAndCombine @propertyWrapper struct Converter { let from: String let to: String let rate: Double var value:Double var wrappedValue: String { get... 阅读详情

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: Int
    let upperBound: Int

    init(wrappedValue: Int, range: ClosedRange<Int>) {
        self.lowerBound = range.lowerBound
        self.upperBound = range.upperBound
        self.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 = false
    var minLength: Int
    var maxLength: Int
    
    init(wrappedValue: String, minLength: Int, maxLength: Int) {
        self.wrappedValue = wrappedValue
        self.minLength = minLength
        self.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. 谨慎使用属性包装器,过度使用可能会增加代码复杂性和难以维护。
swift-一个SwiftPropertyWrapper集合 一个Swift Property Wrapper集合 立即下载

相关推荐

PersistedPropertyWrapper:一个Swift库,可轻松实现持久的UserDefaults存储

永久财产包装 Persisted Property Wrapper是一个Swift库,用于在Apple平台上的数据库中实现非常容易的变量持久化。 要使用Persisted Property Wrapper,您只需将变量注释为@Persisted 。 它支持标准的UserDefaults类型( Int , String , Bool , Date等)以及RawRepresentable枚举(其中RawValue可存储在UserDefaults中)以及任何符合Codable或NSSecureCoding 。 当然还有这些类型中的任何Optional包装。 在编译时检查类型有效性:尝试在不受支持的类型的任何变量上使用将导致编译时错误。 用法 在变量上粘贴一个@Persisted属性。 初始化程序的第一个参数是字符串键,根据该字符串键将值存储在UserDefaults 。 如果类型为非可选,

Swift属性包装器@propertyWrapper

属性包装器,用来修饰属性,它可以抽取关于属性重复的逻辑来达到简化代码的目的。比如:如果你有属性提供了线程安全检查或将数据存到数据库功能,那么你将需要为每个属性编写类似代码。有了属性包装器,我们就可以避免类似重复代码。个人理解:属性包装器是对 set、get方法的封装,不同的属性有相似的set、get,使用属性包装器可以简化相似的代码。

gcs的博客 3220

NXP S32K3xx 多次复位(reset)后MCU跑死、崩溃、出错分析

s32k3出现多次复位后死机的情况

HeFlyYoung的博客 9513

Swift 最佳实践之 Property Wrapper

如上介绍的 RGBValue,日常开发中有很多值有有效取值区间,如:RGB、age、 weekday、fps 等。关于 Property Wrapper 的应用,「只有想不到,没有做不到」,是一个充满想象力和创造力的地方!通过 Property Wrapper 可以很好地将这些逻辑封装起来,极大简化了业务上的处理。合理的封装 Property Wrapper ,可以提升代码的复用性,以及简化业务使用。如上,定义了一个最简单的 Property Wrapper。

Rey的技术博客 927

ATAC-seq差异分析实战:从原始数据到GO富集(R/Bioconductor全流程)

本文提供了ATAC-seq差异分析的完整R/Bioconductor实战流程,涵盖从原始数据准备、一致峰集构建、计数矩阵生成,到使用DESeq2进行差异可及性分析,以及差异峰的基因组注释与GO富集分析。文章详细讲解了关键步骤、参数设置和常见问题,旨在帮助研究者获得可靠且可解释的生物学结果。

weixin_29246195的博客 228

手把手教你用芯驰X9HP驱动MAX96755/MAX96752点亮智能座舱仪表屏(附完整寄存器配置表)

本文详细介绍了如何使用芯驰X9HP驱动MAX96755/MAX96752实现智能座舱仪表屏的完整开发流程,包括硬件架构解析、关键寄存器配置、Linux BSP集成及调试技巧。通过实战指南和完整寄存器配置表,帮助开发者快速掌握驱动开发核心技术,提升智能座舱系统的显示性能与稳定性。

weixin_30879169的博客 526

Swift Property Wrapper 属性包装器

@propertyWrapper属性包装器:在定义存储属性时添加一个分离层,代表该属性被包装起来,且在包装器内部可以做一些事情。把一些通用复用的代码放在了包装器中,比如线程安全检查或者数据存储到数据库中。 个人理解:简单定义的属性只能具备存储功能,供其他方法调用。而被属性包装器修饰的属性不仅具备存储能力,还可以具备计算型属性的能力(setter,与 getter),甚至还可以通过属性包装器存储更多变量或者方法。 官方文档: Property Wrappers Property Wrappers 演化进程

小桥流水哗啦啦,iOS Coder 哒哒哒 1988

基于YOLOv5的人脸识别系统:从构建到应用的全流程指南

本文详细介绍了基于YOLOv5的人脸识别系统开发全流程。首先阐述了YOLOv5模型的高效性和准确性优势,随后分步骤讲解了深度学习环境配置、数据集准备(推荐WIDER FACE数据集)和模型训练方法。重点展示了如何将训练好的模型集成到Tkinter开发的GUI界面中,实现图片上传、人脸检测和结果可视化功能。文章提供完整的代码示例和飞书文档链接(密码:946m22&8),帮助开发者快速构建可交互的人脸识别系统,适用于安防、门禁等多种应用场景。通过该项目,读者可掌握YOLOv5的实际应用和界面集成技术。

FJN110的博客 168

Swift属性的包装器@PropertyWrapper

本文概述 旧方法 新方法:@propertyWrapper注解 可配置包装器 自行访问包装器 投影值 局限性 结论 简而言之, 属性包装器是一种通用结构, 它封装了对该属性的读写访问, 并为其添加了其他行为。如果需要限制可用的属性值, 向读/写访问添加额外的逻辑(例如使用数据库或用户默认值)或添加一些其他方法, 则可以使用它。 本文介绍了一种新的Swift 5.1包装属性的方法, 该方法引入了一种更简洁的新语法。 旧方法 假设你正在开发应用程序, 并且有一个包含用户配置文件数据的对象。 struct A

Rey的技术博客 2456

labelImg使用教程

Anaconda环境 安装 Anaconda 之后,在开始菜单下找到 Anaconda 文件夹 找到 Anaconda Prompt 点击运行 安装 labelImg pip install labelImg #直接命令行输入 启动 labelImg labelImg #直接命令行输入名称即可 labelImg界面 开始标注 快捷键:W(创建方框),A(上一张),D(下一张) XML文件示例 <annotation> <folder>夜读</folder>

G果的博客 3万+

大模型——Coze工作流实战:一键生成像素风格视频

本文介绍了如何利用Coze平台工作流生成像素风格心理学短视频的方法。通过创建工作流、设置变量节点、调用大模型生成文案、数据格式化处理、合成音频、生成字幕等步骤,最终实现从输入主题到生成完整视频的自动化流程。文章详细展示了每个节点的具体配置方法,包括提示词编写和数据处理脚本,为读者提供了完整的像素风格视频制作解决方案。

817

关于Swift的Property Wrappers

由donnywals于2020年6月8日发布 属性包装器是Swift 5.1中引入的一项功能,它们在SwiftUI和Combine中发挥了巨大作用,这是iOS 13中与Swift 5.1一起提供的两个框架。社区很快创建了一些有用的示例,这些示例很快就被人们所接受。 作为属性包装器的用户,您不必担心它们的确切含义或工作方式。 您只需要知道如何使用它们即可。 但是,如果您好奇属性包装器如何在内部工作,这就是适合您的文章。 本周,我想深入研究Property Wrappers,并带您探索它们的工作原理。 .

互动教程网[www.hdjc8.com] 529

Android SELinux——neverallow问题处理(十六)

遇到 neverallow 规则问题,千万别急着去注释/剔除里面原有的规则(原生的尽量别动)。增加 allow 规则是常见的解决办法,但是随着 android 版本的升级,系统对 SELinux 的管控越来越严,增加了大量的 neverallow。一般情况下,向默认标签授予权限的做法是错误的,其中许多权限都是 neverallow 规则所不允许的。按照上面方法去添加 SELinux 可能会违反了 neverallow 规则,编译时候会报 neverallow 相关的错误。

小旭的专栏 2660

Swift 属性包装器

示例代码下载 属性包装器 属性包装器在管理属性存储方式的代码和定义属性的代码之间添加了一个分隔层。举例来说,如果属性需要线程安全性检查或者需要在数据库中存储它们的基本数据,那么必须给每个属性添加同样的逻辑代码。当使用属性包装器时,只需在定义属性包装器时编写一次管理代码,然后应用到多个属性上来进行复用。 定义一个属性包装器,需要创建一个定义 wrappedValue 属性的结构体、枚举或者类。在下面的代码中,TwelveOrLess 结构体确保它包装的值始终是小于等于 12 的数字。如果要求它存储一个更大的数

jiuchabaikaishui的专栏 744

游戏大厂射击游戏无缝大世界游戏DS服务器架构设计方案详解

摘要: 本文深入解析游戏大厂无缝大世界射击游戏的分布式服务器(DS)架构设计方案。以《和平精英》《量子特攻》为例,阐述如何通过动态分区、兴趣管理、弹性扩缩等核心技术应对高并发、低延迟、无缝切换等挑战。架构分为世界协调层、分区计算层、物理判定层等模块,结合微服务化、快照同步和Kubernetes调度,实现玩家跨区无感知迁移与一致判定。重点优化动态负载均衡、状态同步算法及容灾备份,依托分布式数据库与多云部署保障高可用性,为同类游戏提供可扩展的技术范本。(149字) 关键词: 无缝大世界、分布式服务器、动态分区、

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 562

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

swift中常见属性包装器

Swift属性包装器是Swift中强大的特性,允许在属性存储和访问间添加自定义逻辑。本文介绍了SwiftUI核心属性包装器(@State、@Binding、@ObservedObject、@EnvironmentObject)、Combine框架的@Published以及三种自定义属性包装器实现(自动大写、数值约束、线程安全)。这些特性通过封装属性访问逻辑,实现了声明式代码与逻辑复用的平衡,显著减少了模板代码量。文章还总结了各包装器的主要用途和使用场景,展示如何提升代码可维护性和可读性。

chenzimin_blog 681

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

swift属性观察器_了解Swift的属性包装器

swift属性观察器Difficulty: Beginner | Easy | Normal | ChallengingThis article has been developed using Xcode 11.4.1, and Swift 5.2.2 难度:初学者| 容易| 普通 | 具有挑战性本文是使用Xcode 11.4.1和Swift 5.2.2开发的 先决条件: (Prerequi...

weixin_26638123的博客 316

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

swift 中属性包装器的使用说明

swift 中属性包装器的使用说明1. 什么是 @propertyWrapper2. @propertyWrapper使用方式3. 属性包装有什么用处4. 如何使用-举例说明 1. 什么是 @propertyWrapper 这是用来定义一个属性包装器结构的关键字. 2. @propertyWrapper使用方式 @propertyWrapper struct LimitNumber { ... } 3. 属性包装有什么用处 大体来说主要有几个用处:限制边界,减少错误,编码简洁,可读性更好。 4. 如何使用

xuanwenchao的专栏 999

swift属性包装器 propertyWrapper

swift属性包装器 propertyWrapper 什么是属性包装器「propertyWrapper」? 在类、结构体或者枚举的声明时使用该特性,可以让其成为一个属性包装器。如果将该特性应用在一个类型上,将会创建一个与该类型同名的自定义特性。将这个新的特性用于类、结构体、枚举的属性,则可以通过包装器的实例封装对该属性的访问。局部和全局变量不能使用属性包装器。 包装器必须定义一个 wrappedValue 实例属性。该属性 wrapped value 是该属性存取方法暴露的值。大多数时候,wrapp

qq_37161444的博客 645

Swift属性包装器终极指南:深入解析Burritos源码实现原理

Swift属性包装器是Swift 5.1引入的一项强大功能,它允许开发者将通用的属性访问逻辑封装成可重用的组件。Burritos项目作为一个优秀的Swift属性包装器集合,为我们提供了学习和理解这一技术的绝佳范例。本文将深入解析Burritos源码,带你全面掌握Swift属性包装器的实现原理和使用技巧。🚀 ## 什么是Swift属性包装器? Swift属性包装器(Property Wrapp

gitblog_02170的博客 798

Swift属性包装器神器Burritos:快速提升iOS开发效率的终极指南

Burritos是一个强大的Swift属性包装器(Property Wrappers)集合,专为iOS开发者打造,旨在简化代码编写并提升开发效率。通过提供一系列预定义的属性包装器,Burritos帮助开发者轻松实现常见功能,减少重复代码,让开发过程更加流畅高效。 ## 🚀 什么是Swift属性包装器? 属性包装器是Swift语言的一项强大特性,它允许你在定义属性时封装其读取和设置逻辑。通过使

gitblog_01030的博客 801

HoRain云--Swift属性全解析:从存储到包装器

return "当前值: \(number)"print(rectangle.width) // 12 (被限制在12以内)// 访问投影值print($rectangle.width.projectedValue) // "当前值: 12"

sinat_57153473的博客 319

5分钟学会Burritos:Swift属性包装器的最佳实践与代码示例

Burritos是一个实用的Swift属性包装器(Property Wrappers)集合,它提供了多种现成的属性包装解决方案,帮助开发者简化代码并提高开发效率。本文将带你快速了解Burritos的核心功能、使用方法和最佳实践,让你在5分钟内掌握这个强大工具的使用技巧。 ## 什么是Swift属性包装器? 属性包装器是Swift语言的一项强大特性,它允许你封装属性的读写逻辑,实现代码复用和逻辑

gitblog_02070的博客 793

Swift 属性详解:存储属性、计算属性、观察器、包装器与类型属性(《The Swift Programming Language》中文版)

属性(Properties)是 Swift 语言中把值与特定类、结构体或枚举关联起来的核心机制。本篇技术指南以当前仓库 [TSPL.docc/LanguageGuide/Properties.md](https://link.gitcode.com/i/7988f115ef8fe1fd4bb611af2ec1858e) 为骨架,系统讲解 Swift 属性的全部形态:存储属性与延时加载、计算属性与只

gitblog_00036的博客 366

【Alamofire】【Swift】属性包装器注解@propertyWrapper

swift属性包装器注解:@propertyWrapper

allanGold 909

swift 依赖请求_在Swift中使用属性包装器轻松进行依赖注入

swift 依赖请求 iOS App开发 (iOS App Development) If you’re a developer, you probably know that Dependency Injection is required in any decent project. You can’t live without it, since it helps you make your...

weixin_26638123的博客 444
上一篇: Python threading
下一篇: macOS输入法卸载
yimtcode
博客等级 码龄6年 205粉丝 140原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yimtcode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值