如何使用Swift生成随机颜色

112

如何使用Swift编写随机颜色函数?

import UIKit

class ViewController: UIViewController {

    var randomNumber = arc4random_uniform(20)
    var randomColor = arc4random()

    //Color Background randomly
    func colorBackground() {

        // TODO: set a random color
        view.backgroundColor = UIColor.yellow

    }
}
13个回答

1

Swift 5.8.1 扩展

extension UIColor {
    static var random: UIColor {
        return .init(red: .random(in: 0...1), green: .random(in: 0...1), blue: .random(in: 0...1), alpha: 1)
    }
}

使用方法

let randomColor = UIColor.random
print(randomColor)

0
func anotherGetRandomColor()->UIColor{

    let newRed   = Double(arc4random_uniform(256))/255.0
    let newGreen = Double(arc4random_uniform(256))/255.0
    let newBlue  = Double(arc4random_uniform(256))/255.0

    return UIColor(red: CGFloat(newRed), green: CGFloat(newGreen), blue: CGFloat(newBlue), alpha: 1.0)
}

1
这段代码的熵为255255255,可能较弱。最好生成浮点数而不是小整数。此外,arc4random_uniform(255)只会给出0到254之间的值,因此你偏向于较暗的颜色。 - Cœur
1
@Cœur 除此之外,他的除法存在缺陷,因为他在将一个值分成范围为0...254 / 255之后初始化了CGFloat,这将导致所有结果都变为零。 - Leo Dabus

0

✅ 持久化随机颜色

当你知道颜色是由数字组成时,生成随机颜色就变得很容易。只需传入从 0.01.0 的随机值即可。但很多时候,你实际上希望保持随机颜色而不实际存储它。

以下是如何根据种子(例如 userID)生成始终相同的随机颜色:

/// - Note: Make it `Color` for SwiftUI
extension UIColor {
    static func random(seed: Int) -> Self {
        var generator = RandomNumberGenerator(seed: seed)

        return .init(
            red: .random(in: (0...1), using: &generator),
            green: .random(in: (0...1), using: &generator),
            blue: .random(in: (0...1), using: &generator)
            , alpha: 1 // Remove this line for the `SwiftUI.Color`
        )
    }
}

这里是这个背后的随机数生成器:
struct RandomNumberGenerator: Swift.RandomNumberGenerator {
    init(seed: Int) { srand48(seed) }
    func next() -> UInt64 { UInt64(drand48() * Double(UInt64.max)) }
}
SwiftUI 示例:

以下内容始终保持不变,无论每次运行还是每次预览都不会改变。

SwiftUI 示例 请注意,您可以根据自己的需求使用随机生成器


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接