Ios 缓存静态函数导致Swift?

Ios 缓存静态函数导致Swift?,ios,swift,caching,ios8,Ios,Swift,Caching,Ios8,我有一个静态函数,可以生成一个UIColor对象,这样它就可以在整个应用程序中多次重用。我不希望每次都运行这段代码,但实际上只是第一次将其放入缓存,然后让任何后续检索从缓存中获取它。唯一需要注意的是,此值可能会更改,因此我不想永久保留此值,但只将其保留到内存中,以便在重新启动应用程序时,它将获取最新的值并在其整个生命周期中使用它 下面是我的函数的外观: class AppConfig: NSObject { static func getGlobalTintColor(alpha:

我有一个静态函数,可以生成一个
UIColor
对象,这样它就可以在整个应用程序中多次重用。我不希望每次都运行这段代码,但实际上只是第一次将其放入缓存,然后让任何后续检索从缓存中获取它。唯一需要注意的是,此值可能会更改,因此我不想永久保留此值,但只将其保留到内存中,以便在重新启动应用程序时,它将获取最新的值并在其整个生命周期中使用它

下面是我的函数的外观:

class AppConfig: NSObject {   
    static func getGlobalTintColor(alpha: Float = 1) -> UIColor! {
        let colors = split(someVarFromInfoPlist) { $0 == "," }
        let red = CGFloat(colors[0].toInt() ?? 0) / CGFloat(255)
        let green = CGFloat(colors[1].toInt() ?? 0) / CGFloat(255)
        let blue = CGFloat(colors[2].toInt() ?? 0) / CGFloat(255)
        return UIColor(red: red, green: green, blue: blue, alpha: CGFloat(alpha))
    }
}

我不希望
getGlobalTintColor
每次都运行该逻辑。那么,如何在第一次缓存它并在应用程序的剩余生命周期中使用它呢?

您描述的是一个
静态变量,而不是一个函数。为变量提供创建颜色的初始值设定项函数

class AppConfig: NSObject {
    static var alpha : CGFloat = 1
    static var globalTintColor : UIColor = {
        // figure out color once, possibly based on `alpha`
        return theColor
    }()
}

这是因为静态
var
初始值设定项是惰性的;它可能取决于您的
alpha
,在您第一次实际请求它的值之前,它不会被初始化。此外,初始化器函数此后将不会再次运行(除非您退出并重新启动应用程序),这正是您所寻找的。

您描述的是一个
静态变量,而不是一个函数。为变量提供创建颜色的初始值设定项函数

class AppConfig: NSObject {
    static var alpha : CGFloat = 1
    static var globalTintColor : UIColor = {
        // figure out color once, possibly based on `alpha`
        return theColor
    }()
}

这是因为静态
var
初始值设定项是惰性的;它可能取决于您的
alpha
,在您第一次实际请求它的值之前,它不会被初始化。此外,初始化器函数此后将不会再次运行(除非您退出并重新启动应用程序),这正是您要查找的内容。

可能是这样的:

class AppConfig: NSObject {   
    private static var tintColor: UIColor?

    static func getGlobalTintColor(alpha: Float = 1) -> UIColor! {
        if tintColor == nil {
            let colors = split(someVarFromInfoPlist) { $0 == "," }
            let red = CGFloat(colors[0].toInt() ?? 0) / CGFloat(255)
            let green = CGFloat(colors[1].toInt() ?? 0) / CGFloat(255)
            let blue = CGFloat(colors[2].toInt() ?? 0) / CGFloat(255)
            tintColor = UIColor(red: red, green: green, blue: blue, alpha: CGFloat(alpha))
        }
        return tintColor!.colorWithAlphaComponent(CGFloat(alpha))
    }
}

可能是这样的:

class AppConfig: NSObject {   
    private static var tintColor: UIColor?

    static func getGlobalTintColor(alpha: Float = 1) -> UIColor! {
        if tintColor == nil {
            let colors = split(someVarFromInfoPlist) { $0 == "," }
            let red = CGFloat(colors[0].toInt() ?? 0) / CGFloat(255)
            let green = CGFloat(colors[1].toInt() ?? 0) / CGFloat(255)
            let blue = CGFloat(colors[2].toInt() ?? 0) / CGFloat(255)
            tintColor = UIColor(red: red, green: green, blue: blue, alpha: CGFloat(alpha))
        }
        return tintColor!.colorWithAlphaComponent(CGFloat(alpha))
    }
}

您可以创建一个返回函数的函数,将其返回值缓存到属性中,然后调用存储在该属性中的函数,根据alpha计算实际颜色

这是“缓存”功能:

private static func _getGlobalTintColor() -> (Float) -> UIColor {
    let colors = split(someVarFromInfoPlist) { $0 == "," }
    let red = CGFloat(colors[0].toInt() ?? 0) / CGFloat(255)
    let green = CGFloat(colors[1].toInt() ?? 0) / CGFloat(255)
    let blue = CGFloat(colors[2].toInt() ?? 0) / CGFloat(255)
    return { alpha in UIColor(red: red, green: green, blue: blue, alpha: CGFloat(alpha)) }
}
private static let globalColor = AppConfig._getGlobalTintColor()
如您所见,它返回一个带有签名的函数
(Float)->UIColor
,即以alpha为参数并返回颜色

接下来,使用此函数的返回值初始化静态属性:

private static func _getGlobalTintColor() -> (Float) -> UIColor {
    let colors = split(someVarFromInfoPlist) { $0 == "," }
    let red = CGFloat(colors[0].toInt() ?? 0) / CGFloat(255)
    let green = CGFloat(colors[1].toInt() ?? 0) / CGFloat(255)
    let blue = CGFloat(colors[2].toInt() ?? 0) / CGFloat(255)
    return { alpha in UIColor(red: red, green: green, blue: blue, alpha: CGFloat(alpha)) }
}
private static let globalColor = AppConfig._getGlobalTintColor()
最后,公开的静态函数接受一个alpha参数,并调用存储在该属性中的函数以获取并返回颜色:

static func getGlobalTintColor(alpha: Float = 1) -> UIColor {
    return self.globalColor(alpha)
}
请注意,可以删除第一个私有函数,并使用内联闭包初始化属性:

class AppConfig: NSObject {
    private static let globalColor: Float -> UIColor = {
        let colors = split(someVarFromInfoPlist) { $0 == "," }
        let red = CGFloat(colors[0].toInt() ?? 0) / CGFloat(255)
        let green = CGFloat(colors[1].toInt() ?? 0) / CGFloat(255)
        let blue = CGFloat(colors[2].toInt() ?? 0) / CGFloat(255)
        return { alpha in UIColor(red: red, green: green, blue: blue, alpha: CGFloat(alpha)) }
    }()

    static func getGlobalTintColor(alpha: Float = 1) -> UIColor {
        return self.globalColor(alpha)
    }
}

您可以创建一个返回函数的函数,将其返回值缓存到属性中,然后调用存储在该属性中的函数,根据alpha计算实际颜色

这是“缓存”功能:

private static func _getGlobalTintColor() -> (Float) -> UIColor {
    let colors = split(someVarFromInfoPlist) { $0 == "," }
    let red = CGFloat(colors[0].toInt() ?? 0) / CGFloat(255)
    let green = CGFloat(colors[1].toInt() ?? 0) / CGFloat(255)
    let blue = CGFloat(colors[2].toInt() ?? 0) / CGFloat(255)
    return { alpha in UIColor(red: red, green: green, blue: blue, alpha: CGFloat(alpha)) }
}
private static let globalColor = AppConfig._getGlobalTintColor()
如您所见,它返回一个带有签名的函数
(Float)->UIColor
,即以alpha为参数并返回颜色

接下来,使用此函数的返回值初始化静态属性:

private static func _getGlobalTintColor() -> (Float) -> UIColor {
    let colors = split(someVarFromInfoPlist) { $0 == "," }
    let red = CGFloat(colors[0].toInt() ?? 0) / CGFloat(255)
    let green = CGFloat(colors[1].toInt() ?? 0) / CGFloat(255)
    let blue = CGFloat(colors[2].toInt() ?? 0) / CGFloat(255)
    return { alpha in UIColor(red: red, green: green, blue: blue, alpha: CGFloat(alpha)) }
}
private static let globalColor = AppConfig._getGlobalTintColor()
最后,公开的静态函数接受一个alpha参数,并调用存储在该属性中的函数以获取并返回颜色:

static func getGlobalTintColor(alpha: Float = 1) -> UIColor {
    return self.globalColor(alpha)
}
请注意,可以删除第一个私有函数,并使用内联闭包初始化属性:

class AppConfig: NSObject {
    private static let globalColor: Float -> UIColor = {
        let colors = split(someVarFromInfoPlist) { $0 == "," }
        let red = CGFloat(colors[0].toInt() ?? 0) / CGFloat(255)
        let green = CGFloat(colors[1].toInt() ?? 0) / CGFloat(255)
        let blue = CGFloat(colors[2].toInt() ?? 0) / CGFloat(255)
        return { alpha in UIColor(red: red, green: green, blue: blue, alpha: CGFloat(alpha)) }
    }()

    static func getGlobalTintColor(alpha: Float = 1) -> UIColor {
        return self.globalColor(alpha)
    }
}

假设整个应用程序中的alpha输入可以变化,您可以考虑使用nSCHACE,其中键是由颜色和alpha形成的字符串,值是在NoStObjor子类中包装的UICOLor。< /P>

NSCache将被声明为:

private static let cache = NSCache()

假设整个应用程序中的alpha输入可以变化,您可以考虑使用nSCHACE,其中键是由颜色和alpha形成的字符串,值是在NoStObjor子类中包装的UICOLor。< /P>

NSCache将被声明为:

private static let cache = NSCache()

我建议将其拆分为一个惰性
静态
常量,其中包含一个固定的alpha和一个单独的函数来指定alpha:

class AppConfig: NSObject {    
    static let globalTintColor: UIColor = {
        let colors = split(someVarFromInfoPlist) { $0 == "," }
        let red = CGFloat(colors[0].toInt() ?? 0) / CGFloat(255)
        let green = CGFloat(colors[1].toInt() ?? 0) / CGFloat(255)
        let blue = CGFloat(colors[2].toInt() ?? 0) / CGFloat(255)
        return UIColor(red: red, green: green, blue: blue, alpha: 1)
    }()

    static func globalTintColor(alpha: CGFloat) -> UIColor {
        return globalTintColor.colorWithAlphaComponent(alpha)
    }
}

我建议将其拆分为一个惰性
静态
常量,其中包含一个固定的alpha和一个单独的函数来指定alpha:

class AppConfig: NSObject {    
    static let globalTintColor: UIColor = {
        let colors = split(someVarFromInfoPlist) { $0 == "," }
        let red = CGFloat(colors[0].toInt() ?? 0) / CGFloat(255)
        let green = CGFloat(colors[1].toInt() ?? 0) / CGFloat(255)
        let blue = CGFloat(colors[2].toInt() ?? 0) / CGFloat(255)
        return UIColor(red: red, green: green, blue: blue, alpha: 1)
    }()

    static func globalTintColor(alpha: CGFloat) -> UIColor {
        return globalTintColor.colorWithAlphaComponent(alpha)
    }
}

正如您所给出的,这是不可能的,因为您传递了一个参数(
alpha
)。不能自动缓存接受参数的任意函数的结果。如果删除该参数,则可以看到@matt的答案是有用的。@RobNapier即使使用
alpha
,他也可以这样做,如果他首先将该参数配置为另一个静态变量。您是否计划缓存第一次调用的alpha,或者该参数将保持可修改状态?func是否有任何理由返回隐式展开的可选值?为什么这不是一个非可选的?对变量alpha有很好的理解。我真的错过了那个细节!也许可以缓存UIColor,然后在每次调用UIColor时应用alpha?正如您所给出的,这是不可能的,因为您传递了一个参数(
alpha
)。不能自动缓存接受参数的任意函数的结果。如果删除该参数,则可以看到@matt的答案是有用的。@RobNapier即使使用
alpha
,他也可以这样做,如果他首先将该参数配置为另一个静态变量。您是否计划缓存第一次调用的alpha,或者该参数将保持可修改状态?func是否有任何理由返回隐式展开的可选值?为什么这不是一个非可选的?对变量alpha有很好的理解。我真的错过了那个细节!也许UIColor可以被缓存,然后alpha可以在每次调用UIColor后应用?哇,这太棒了!!在保持alpha动态的同时,仍然很难理解返回闭包是如何缓存在内存中的。@TruMan1:这是通过捕获完成的-我建议阅读《哇,这太棒了!!在保持alpha动态的同时,仍然很难理解返回闭包是如何缓存在内存中的。@TruMan1:这是通过捕获完成的-我建议阅读