记录日常使用琐碎. 点滴知识,贵在累积,未见其增而日有所长
1. 计算数组中元素的重复次数
let array = ["a","b","c","f","a","b","a","c"]
// 先将数组变换为元组数组
let tuplesArray = array.map{($0,1)}
// 根据元组数组创建字典,并处理相同键操作(+)
let resultDictionary = Dictionary(tuplesArray, uniquingKeysWith: +)
print(resultDictionary)
// 输出结果["b": 2, "f": 1, "a": 3, "c": 2]
2. 保留Struct默认初始化方法
同时添加自定义的初始化方法
Swift
中的Struct
都有个系统提供默认的
包含所有成员遍量的init方法
,如果我们添加自定义的init
方法时,系统默认提供的
就会消失,如果需要既可以保留系统默认
的init方法,又需要添加自定义
的init,可以使用一个小技巧:
将自定义的init方法
写在Struct
的extension
中
struct Student {
var name: String
var age: Int
}
extension Student {
init(name: String) {
self.name = name
age = 0
}
}
这样,我们就可以有两个初始化方法
let s1 = Student(name: "Taylor", age: 22) // 系统默认提供init
let s2 = Student(name: "Taylor Swift") // 自定义init
3. 给Enum
添加辅助关联的
数据
通过给Enum
添加辅助的关联数据
,我们可以对每个case
中的数据
进行更详细的描述.
enum DeviceOS {
case tvOs
case macOs(version: Int) // 添加版本描述
case iOS(phone: String) // 添加描述
}
在使用的时候,我们就可以更灵活的添加描述了.
let d = DeviceOS.iOS(phone: "iphone5")
let f = DeviceOS.macOs(version: 10)
let g = DeviceOS.tvOS
print("d= \(d), f = \(f), g = \(g)") // 输出d= iOS("iphone5"), f = macOs(10), g = tvOS
4. 编译时检测Swift的版本
使用#if swift()
可以帮助我们对Swift的版本进行编译检测
#if swift(>=4.0)
print("swift版本不低于4.0")
#else
print("swift 版本低于4.0")
#endif
5. precondition()
与assert()
的区别
assert()
是开发中常用进行代码检测的手段,如果不符合限定条件
时,代码会crash
,帮助我们定位错误,但将App编译
为发布(Release)版本
时,所有的assert()
语句都会被移除.也就是说assert()
只工作在我们的代码开发调试(Debug)
阶段.
而precondition()
则在编译Release
版本时,不会被移除!!!,如果你希望发布后的App
在某种错误
的情况闪退
,就可以使用precondition()
5. NSRange
转换Swift Range
let input = "this is swift string"
let range = NSMakeRange(0, 12)
let swiftRange = Range(range, in: input)
6. 角度(angles)
与弧度( radians)
相互转换
// 角度 -> 弧度
func degree2radian(_ number: Double) -> Double {
return number * .pi / 180
}
// 弧度 -> 角度
func radian2degree(_ number: Double) -> Double {
return number * 180 / .pi
}
7. 获取系统处理器
的运行压力
状态
使用ProcessInfo.processInfo.thermalState
获取处理器的当前运行状态,一共有四种情况:
.critical
: 极度严重, 最好停止你的一切
操作,尤其是动画
等耗时工作
.serious
: 严重, 系统工作在一个高度运转
状态,最好缩减你的CPU/GPU
或者IO
操作等
.nominal
: 正常
.fair
: 合理 , 通常可以释放
一些不可见的UI
资源
let states = ProcessInfo.processInfo.thermalState
switch states {
case .critical:
print("system 要死了,警告你别惹我!")
case .nominal:
print("system 正常运行")
case .serious:
print("system 很累啦~但还能勉强坚持一阵")
default:
print("system 你要注意合理调度哦~")
}
8. 设置UIView/NSView
的指定圆角
(限于iOS11.0+,macOS10.13)
let redView = UIView(frame: CGRect(x: 70, y: 80, width: 110, height: 110)) // 若macOS中 则使用NSView
redView.backgroundColor = .red // macOS中为redView.layer.backgroundColor
redView.layer.cornerRadius = 20
if #available(iOS 11.0, *) {
redView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMaxYCorner]
} else {
// Fallback on earlier versions
}
view.addSubview(redView)
9. 获取两个数组中不同的内容
给数组添加一个Extension
extension Array where Element: Hashable {
func difference(from other: [Element]) -> [Element] {
return Array(Set(self).symmetricDifference(Set(other)))
}
}
然后就可以这样使用了
let n1 = ["a", "b", "c","d"]
let n2 = ["c", "d", "e"]
let difference = n1.difference(from: n2)
print(difference) // 输出 ["b", "e", "a"]
10. 限制代码仅在模拟器/真机
环境运行
#if (arch(i386) || arch(x86_64))
// 这段代码只会在模拟器中运行
#endif
#if (arch(arm64) || arch(armv7))
// 这段代码只在真机中运行
#endif