使用磁盘中的图像数据填充阵列时崩溃

Crash when populating array with image data from disk

我正在将 UIImages 保存到磁盘:

let sketchData: NSData = UIImagePNGRepresentation(sketch)
let sketchPath: String = NSHomeDirectory().stringByAppendingPathComponent("Documents/Sketch\(indexNumber).png")
sketchData.writeToFile(sketchPath, atomically: true)

然后,我尝试用它们重新填充一个数组:

if lengthOfSketchArray > 0 {
    for indexNumber in 0...lengthOfSketchArray {
        let sketchPath: String = NSHomeDirectory().stringByAppendingPathComponent("Documents/Sketch\(indexNumber).png")
        let image = UIImage(contentsOfFile: sketchPath)
        slideSketchArray[indexNumber] = image!
        }
    }

在最后一行,我得到 "fatal error: unexpectedly found nil while unwrapping an Optional value"。

我尝试了很多变体,但每一个都崩溃了。我做错了什么?


更新

现在可以使用了!我已经根据评论更改了很多东西,包括使用 NSSearchPathForDirectoriesInDomains,以及不再将图像保存在数组中。现在我正在保存图像路径,并在需要时从磁盘加载图像。

func saveImageToDisk() {
    let sketchData: NSData = UIImagePNGRepresentation(sketch)
    let destinationFolder: String = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
    let sketchPath: String = "\(destinationFolder)\(currentProjectID).png"
    sketchData.writeToFile(sketchPath, atomically: true)
    let currentMetadata: [String: String] = [
        "sketchpath": sketchPath
    ]
    allMetadata.append(currentMetadata)
    defaults.setObject(allMetadata, forKey: "allMetadata")

func loadImageAtIndex(index: Int) -> UIImage {
    let sketchPath: String = allMetadata[index].objectForKey("sketchpath") as String
    let image = UIImage(contentsOfFile: sketchPath)
    return image!
}

'...' 在 for 循环中意味着您将 lengthOfSketchArray 作为迭代器的最后一个值。也许这就是为什么它在最后一个值崩溃导致它超出你的数组长度。您应该使用 (lengthOfSteckArray-1) 或 .. 而不是 ...(我在 Swift 书中读到,但我不是 100%)。无论如何,您应该在包装它以获取值之前验证您的可选变量是否有值。然后,使用 NSSearchPathForDirectoriesInDomains 检索您的文档文件夹的路径

var documentDir: String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String
    if lengthOfSketchArray > 0 {
        for indexNumber in 0..lengthOfSketchArray {
            let sketchPath: String = documentDir.stringByAppendingPathComponent("Sketch\(indexNumber).png")
            let image = UIImage(contentsOfFile: sketchPath)
            slideSketchArray[indexNumber] = image!
            }
        }

您正在使用 0 ... lengthOfSketchArray 的 "closed" 范围,其中将包括 零和 lengthOfSketchArray(即您将重复此 lengthOfSketchArray + 1 次)。我认为您打算使用 0 ..< lengthOfSketchArray 的 "half-open" 范围,其中不包括 lengthOfSketchArray,即从零到 lengthOfSketchArray - 1:

let documentsFolder = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String

for index in 0 ..< lengthOfSketchArray {
    let path = documentsFolder.stringByAppendingPathComponent("Sketch\(index).png")
    if let image = UIImage(contentsOfFile: path) {
        slideSketchArray[index] = image
    }
}

顺便说一句,我正在使用 NSSearchPathForDirectoriesInDomains 查找文档文件夹。显然,您在保存图像时也会使用相同的技术。

此外,以上假设您已经声明并实例化了这个数组。例如,如果它是一个 Swift 数组,例如

var slideSketchArray = [UIImage]()