我写了一个UIColor
的扩展名来直接更改alpha:
public extension UIColor {
public var rgbaComponents: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
var components: [CGFloat] {
let c = cgColor.components!
if c.count == 4 {
return c
}
return [c[0], c[0], c[0], c[1]]
}
let r = components[0]
let g = components[1]
let b = components[2]
let a = components[3]
return (red: r, green: g, blue: b, alpha: a)
}
public var alpha: CGFloat {
get {
return cgColor.alpha
}
set {
var rgba = rgbaComponents
self = UIColor(red: rgba.red // error here: "cannot assign to value: 'self' is immutable"
, green: rgba.green, blue: rgba.blue, alpha: newValue)
}
}
}
但是有一个错误:
无法赋值:'self'是不可变的
但是分配给自己的日期扩展是可以的
public extension Date {
public var day: Int {
get {
return Calendar.current.component(.day, from: self)
}
set {
let allowedRange = Calendar.current.range(of: .day, in: .month, for: self)!
guard allowedRange.contains(newValue) else { return }
let currentDay = Calendar.current.component(.day, from: self)
let daysToAdd = newValue - currentDay
if let date = Calendar.current.date(byAdding: .day, value: daysToAdd, to: self) {
self = date // This is OK
}
}
}
}
是因为UIColor
来自NSObject
而Date是Swift结构吗?根本原因是什么?
答案 0 :(得分:1)
你纠正它是因为Date是一个struct(值类型)而UIColor是一个类(引用类型)。
当你为一个结构分配给self时,你实际上只是更新了该结构的所有属性(简单地说),所以实际的内存位置不会改变。所以你实际上并没有改变自我的价值。
但是当你为一个类分配给self时,你正在内存中创建一个完整的新类,所以当你将它分配给self时,你正试图改变self。即使允许持有对颜色的引用的任何东西如何处理它,因为它们仍将保持对原始类的引用。