Swift 常用类别整理

news/2025/2/19 5:41:48/

生成颜色,传入16进制数字生成对应颜色

个人不喜欢传字符串的写法,比如 "0x0080FF" 或者 "0080FF",原因如下:

  • 传了字符串最后还是要解析成数字参与颜色运算的,需要额外做字符串转数字的操作,不如直接使用16进制数字更合适
  • 输入内容不可控,需要更多的校验,入参为字符串,使用方可以传 "abc" 等无效字符,
    • 检查内容输入合法性多余且不必要,而且作为全局使用的工具方法,浪费性能
    • 不检查作为工具方法感觉缺失功能,缺乏安全意识,没有防御性编程。

let color = UIColor(rgb: 0x0080FF) 

extension UIColor {convenience init(red: Int, green: Int, blue: Int, alpha: CGFloat) {assert(red >= 0 && red <= 255, "Invalid red component")assert(green >= 0 && green <= 255, "Invalid green component")assert(blue >= 0 && blue <= 255, "Invalid blue component")self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: alpha)}convenience init(rgb: Int, alpha: CGFloat = 1) {self.init(red: (rgb >> 16) & 0xFF,green: (rgb >> 8) & 0xFF,blue: rgb & 0xFF,alpha: alpha)}
}

整型和浮点型类型转换

在Swift中,做常用的加减乘除都需要先转换类型才能进行计算,在给视图计算Frame时,经常需要这样的宽高计算,

比如视图宽度 = 数量 * 单个元素宽度 + 元素之间间距,

  • 元素数量一般为Int,
  • 而元素宽度一般根据内容计算,大多数为CGFloat,
  • 元素之间间距一般为UI给的标注,Int和CGFloat都有,
  • 生成最终宽度一般为CGFloat,

这样一个简单地计算过程中涉及到多次类型强制转换。

在使用OC开发中,一般不用这样写,因为C语言会自动进行类型转换,最终生成浮点型结果。

而在Swift中这样写,就会报错

那么我们想按照正常的c语言开发习惯,可以在Swift中通过重载常见的运算符,支持Int和CGFloat之间的互相运算,比如下面的写法。

// 左侧为CGFloat, 右侧为Int
public func * (left: CGFloat, right: Int) -> CGFloat {return left * CGFloat(right)
}public func + (left: CGFloat, right: Int) -> CGFloat {return left + CGFloat(right)
}public func - (left: CGFloat, right: Int) -> CGFloat {return left - CGFloat(right)
}public func / (left: CGFloat, right: Int) -> CGFloat {if right == 0 {return CGFloat.nan} else {return left * CGFloat(right)}
}// 左侧为Int, 右侧为CGFloat
public func * (left: Int, right: CGFloat) -> CGFloat {return CGFloat(left) * right
}public func + (left: Int, right: CGFloat) -> CGFloat {return CGFloat(left) + right
}public func - (left: Int, right: CGFloat) -> CGFloat {return CGFloat(left) - right
}public func / (left: Int, right: CGFloat) -> CGFloat {if right == 0 {return CGFloat.nan} else {return CGFloat(left) / right}
}

经过运算符重载后,返回值都为CGFloat,和正常开发过程中的期望是一致的。

Swift有完整的访问控制权限,如果三方库没有显式的import 这些函数所在的target的话,这些运算符的重载完全不会影响到三方库,三方库内部还是会编译报错;只有明确的使用了import,这些函数才会生效,影响范围已知且可控。

如果还是担心重载的影响范围太大,可以将重载运算符的声明范围为 internal 或者 不写,这样就只有本模块可以使用,外部模块一定无影响,并且外部模块使用时还是会保持编译报错的状态。



http://www.ppmy.cn/news/1214964.html

相关文章

头歌答案--数据持久化(非数据库)

目录 ​编辑 数据持久化&#xff08;非数据库&#xff09; 第1关&#xff1a;数据持久化&#xff08;非数据库&#xff09; 任务描述 多线程、多进程爬虫 第1关&#xff1a;多线程、多进程爬虫 任务描述 Scrapy爬虫基础 任务描述 MySQL数据库编程 第1关&#xff1a;…

火山引擎云原生存储加速实践

在火山引擎相关的业务中绝大部分的机器学习和数据湖的算力都运行在云原生 K8s 平台上。云原生架构下存算分离和弹性伸缩的计算场景&#xff0c;极大的推动了存储加速这个领域的发展&#xff0c;目前业界也衍生出了多种存储加速服务。但是面对计算和客户场景的多样性&#xff0c…

C#医学检验室(LIS)信息管理系统源码

LIS:实验室信息管理系统 (Laboratory Information Management System简称:LIS)。 LIS 是面向医院检验科、检验中心、动物实验所、生物医疗研究所等科研单位研发的集数据采集、传输、存储、分析、处理、发布等功能于一体的信息管理系统。 一、完善的质控&#xff1a; 从样本管理…

Mac常用软件安装

brew安装 brew 是从下载源码解压然后 ./configure && make install &#xff0c;同时会包含相关依存库。并自动配置好各种环境变量&#xff0c;而且易于卸载。 这个对程序员来说简直是福音&#xff0c;简单的指令&#xff0c;就能快速安装和升级本地的各种开发环境。 …

ARM课程发送一个字符,接收一个字符

fun.c #include "my_typ_head.h"//初始化 void uart_init() {//1.使能GPIOB/GPIOG/UART4时钟 RCC_MP_AHB4ENSETR/RCC_MP_APB1ENSETR//设置GPIOB\GPIOG控制器时钟使能 0X50000A28(*(unsigned int *)0X50000A28) | (0X10);(*(unsigned int *)0X50000A28) | (0X1<…

Matlab运算相关函数总结

matlab作为一项计算语言&#xff0c;无疑是由很多实用的运算函数可供调用的&#xff0c;学会这些函数&#xff0c;对于我们进行程序编写能节省时间、精简代码、减少出错概率。 一、取整 1.round() 四舍五入取整 2、ceil() 向上取整&#xff0c;ceil是天花板的意思 x 3.1…

智慧工地源码:助力数字建造、智慧建造、安全建造、绿色建造

智慧工地围绕建设过程管理&#xff0c;建设项目与智能生产、科学管理建设项目信息生态系统集成在一起&#xff0c;该数据在虚拟现实环境中&#xff0c;将物联网收集的工程信息用于数据挖掘和分析&#xff0c;提供过程趋势预测和专家计划&#xff0c;实现工程建设的智能化管理&a…

4.0 Linux进程前导知识

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 冯.诺依曼体系 CPU&#xff1a;运算器&#xff0c;控制器 输入设备&#xff1a;键盘&#xff0c;麦克风&#xff0c;摄像头&#xff0c;鼠标&#xff0c;网卡&#xff0c;磁盘等。 输出设备&#xff1a;显示器&#xff0…