我一直在尝试实现一个单例用作照片的缓存,我从网上上传到我的iOS应用程序.我在下面的代码中附加了三个变体.我试图让变量2工作,但它导致编译器错误,我不明白,并希望得到帮助我做错了什么.变体1执行缓存但我不喜欢使用全局变量.变体3没有进行实际的缓存,我相信这是因为我在var ic = ....的赋值中得到了一个副本,这是正确的吗?
任何反馈和见解将不胜感激.
谢谢,Zvi
import UIKit
private var imageCache: [String: UIImage?] = [String : UIImage?]()
class ImageCache {
class var imageCache: [String : UIImage?] {
struct Static {
static var instance: [String : UIImage?]?
static var token: dispatch_once_t = 0
}
dispatch_once(&Static.token) {
Static.instance = [String : UIImage?]()
}
return Static.instance!
}
}
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
imageView.image = UIImage(data: NSData(contentsOfURL: NSURL(string: "http://images.apple.com/v/iphone-5s/gallery/a/images/download/photo_1.jpg")!)!)
//variant 1 - this code …
Run Code Online (Sandbox Code Playgroud) 下面 sum 函数的两个变体是我尝试用 Swift 重复 Abelson 和 Sussman 在经典的《计算机程序的结构和解释》一书中介绍的 lisp 版本。第一个版本用于计算某个范围内的整数之和,或某个范围内的整数的平方和,第二个版本用于计算 pi/8 的近似值。
我无法将这些版本组合成一个可以处理所有类型的函数。有没有一种巧妙的方法来使用泛型或其他一些 Swift 语言功能来组合变体?
func sum(term: (Int) -> Int, a: Int, next: (Int) -> Int, b: Int) -> Int {
if a > b {
return 0
}
return (term(a) + sum(term, next(a), next, b))
}
func sum(term: (Int) -> Float, a: Int, next: (Int) -> Int, b: Int) -> Float {
if a > b {
return 0
}
return (term(a) + sum(term, next(a), next, b))
} …
Run Code Online (Sandbox Code Playgroud)