Swift 常用类别整理

生成颜色,传入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,生成最终宽度一般为CGFloat,计算过程中涉及到类型强制转换。

在使用OC开发中,一般不用这样写,因为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.hqwc.cn/news/169207.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++套接字库sockpp介绍

sockpp是一个开源、简单、现代的C套接字库&#xff0c;地址为&#xff1a;https://github.com/fpagliughi/sockpp&#xff0c;最新发布版本为0.8.1&#xff0c;license为BSD-3-Clause。目前支持Linux、Windows、Mac上的IPv4、IPv6和Unix域套接字。其它*nix和POSIX系统只需很少的…

链表经典OJ题(链表回文结构,链表带环,链表的深拷贝)

目录 前言 1.反转一个单链表。 2. 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。 3.链表的回文结构。 4.链表带环问题&#xff08;*****&#xff09; 4.1是否带环 4.2 入环的节点 5.随机链表的复制&#xff08;链表的深拷贝&#xff09; 前言…

Http状态码502常见原因及排错思路(实战)

Http状态码502常见原因及排错思路 502表示Bad Gateway。当Nginx返回502错误时&#xff0c;通常表示Nginx作为代理服务器无法从上游服务器&#xff08;如&#xff1a;我们的后端服务器地址&#xff09;获取有效的响应。导致这种情况的原因有很多&#xff1a; 后端服务器故障ngin…

「题解」反转链表 返回中间节点

文章目录 &#x1f349;题目1&#xff1a;反转链表&#x1f349;解析&#x1f34c;解法一&#xff1a;创建一个新链表&#x1f34c;解法二&#xff1a;直接操作原链表 &#x1f349;题目2&#xff1a;返回中间节点&#x1f34c;解法一&#xff1a;快慢指针&#x1f34c;解法二&…

【Linux】 reboot 命令使用

reboot 命令用于用来重新启动计算机。 语法 reboot [参数] 命令选项及作用 执行令 man --reboot 执行命令结果 参数 -n : 在重开机前不做将记忆体资料写回硬盘的动作-w : 并不会真的重开机&#xff0c;只是把记录写到 /var/log/wtmp 档案里-d : 不把记录写到 /var/log…

第25章_索引优化与查询优化

文章目录 1. 数据准备2.索引失效案例2.1全值匹配2.2最佳左前缀法则2.3主键插入顺序2.4 计算、函数导致索引失效2.5 类型转换导致索引失效2.6 范围条件右边的列索引失效2.7 不等于(! 或者<>)索引失效2.8 is null可以使用索引&#xff0c;is not null无法使用索引2.9 like以…

机器学习——奇异值分解案例(图片压缩-代码简洁版)

本想大迈步进入前馈神经网络 但是…唉…瞅了几眼&#xff0c;头晕 然后想到之前梳理的奇异值分解、主成分分析、CBOW都没有实战 如果没有实际操作&#xff0c;会有一种浮在云端的虚无感 但是如果要实际操作&#xff0c;我又不想直接调用库包 可是…如果不直接调包&#xff0c;感…

【Linux网络】系统调优之聚合链路bonding,可以实现高可用和负载均衡

一、什么是多网卡绑定 二、聚合链路的工作模式 三、实操创建bonding设备&#xff08;mode1&#xff09; 1、实验 2、配置文件解读 3、查看bonding状态,验证bonding的高可用效果 三、nmcli实现bonding 一、什么是多网卡绑定 将多块网卡绑定同一IP地址对外提供服务&#xf…

C++进阶-STL set/multiset容器和map容器的简单认识

set/multiset容器的简单认识 set基本概念set与multiset 的区别&#xff1a;set容器的构造和赋值set容器的大小和交换set容器的插入与删除set容器的查找和统计set容器-set和multiset的区别set容器内置类型指定排序规则set容器自定义数据类型指定排序规则 pair对组创建map容器的基…

2.OpenResty系列之Lua入门

1. Lua简介 Lua是一种轻量级的、高效的脚本编程语言&#xff0c;最初由巴西里约热内卢天主教大学的一个研究小组开发和发布。Lua的设计目标是提供一个简单、可嵌入、可扩展的脚本语言&#xff0c;官方实现完全采用 ANSI C 编写&#xff0c;能以 C 程序库的形式嵌入到其他应用程…

牛客、赛码网OJ调试(全)

现在无论开发还是测试&#xff0c;面试的时候都需要考察代码能力。 从测试的职业发展来看&#xff0c;现在市场上对于纯功能测试的需求很少&#xff0c;招聘方均要求面试者一方面具备测试基础能力&#xff0c;也要求有点代码能力。 对于测试来说&#xff0c;除了测试开发&#…

Matplotlib绘图一网打尽【持续更新ing】

2 绘制扇形图 绘制一个展示男女乘客比例的扇形图 得出男女的具体数字 sex_per df["Sex"].value_counts() sex_per # 把画图的包导入进来 import matplotlib.pyplot as plt# 这种绘图方式主要用于有多个子图以及复杂的图形布局的时候。fig,ax plt.subplots()# pl…