You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:22:47