Swift中如何为颜色变化实现Property Observer并打印提示信息
嘿,我来帮你搞定这个属性观察者的问题!你已经完成了随机颜色生成的核心部分,现在只需要给控制背景色的属性加上属性观察者,就能在颜色变化时自动打印提示信息啦~
核心思路:用didSet监听属性变化
属性观察者里的didSet会在属性值被更新(且和旧值不同)时自动执行代码,刚好符合你“颜色改变时打印提示”的需求。我们只需要在ViewController里定义一个带didSet的背景色属性,然后把按钮点击的颜色赋值逻辑指向这个属性就行。
完整代码示例
1. 完善你的UIColorExtension.swift
先优化随机颜色的生成逻辑(避免重复初始化seed),再添加一个打印RGB值的扩展方法,让提示信息更直观:
import UIKit extension UIColor { static var random: UIColor { // 只初始化一次随机种子,保证随机性更合理 static let seedInitializer: Void = { srand48(Int(arc4random())) }() _ = seedInitializer // 触发种子初始化 let red = CGFloat(drand48()) let green = CGFloat(drand48()) let blue = CGFloat(drand48()) return UIColor(red: red, green: green, blue: blue, alpha: 1.0) } // 扩展方法:提取并打印颜色的RGB值 func printRGBDetails() { var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0 self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) let rgbString = String(format: "R=%.2f, G=%.2f, B=%.2f", red, green, blue) print("背景色已切换:\(rgbString)") } }
2. 在ViewController.swift中实现属性观察者
定义带didSet的属性,把背景色更新和打印逻辑都放在观察者里:
import UIKit class ViewController: UIViewController { // 带属性观察者的背景色属性 var currentBackgroundColor: UIColor = .white { didSet { // 更新视图背景色 view.backgroundColor = currentBackgroundColor // 触发颜色信息打印 currentBackgroundColor.printRGBDetails() } } override func viewDidLoad() { super.viewDidLoad() // 初始化默认背景色 currentBackgroundColor = .white // 假设你已经有切换按钮,这里补个示例实现 let colorButton = UIButton(type: .system) colorButton.setTitle("切换背景色", for: .normal) colorButton.addTarget(self, action: #selector(changeColorTapped), for: .touchUpInside) colorButton.frame = CGRect(x: view.center.x - 100, y: view.center.y - 25, width: 200, height: 50) view.addSubview(colorButton) } @objc func changeColorTapped() { // 直接给属性赋值,自动触发didSet里的逻辑 currentBackgroundColor = UIColor.random } }
关键点解释
didSet的作用:每次currentBackgroundColor被赋值时,只要新值和旧值不一样,就会自动执行didSet里的代码,包括更新背景色和打印提示。- 优化随机种子:把
srand48放在static块里,确保只初始化一次,避免每次生成随机颜色都重置种子,导致随机性下降。 - 自定义打印信息:通过
getRed(_:green:blue:alpha:)方法提取颜色的RGB值,打印出更易读的信息,而不是默认的UIColor内存地址描述。
现在运行你的应用,每次点击按钮切换颜色时,控制台都会输出对应的RGB信息啦~
内容的提问来源于stack exchange,提问作者SwiftLearner
相关产品推荐
相关产品推荐

