Nil 同时展开一个实际具有值的可选

Posted

技术标签:

【中文标题】Nil 同时展开一个实际具有值的可选【英文标题】:Nil while unwrapping an optional that actually has a value 【发布时间】:2018-08-03 19:33:06 【问题描述】:

我在打开一个可选项时遇到了一个非常奇怪的错误。当我打印该值时,我实际上可以看到它,但是它崩溃并显示:

致命错误:在展开可选值时意外发现 nil

这是代码(fetchPost()viewDidLoad() 中被调用:

func fetchPost() 
    Api.Posts.observePostIncludingImages(withId: postId)  (post, photosStringArray) in

        self.isLiked(postId: post.id!, completion:  boolValue in
            Api.Posts.fetchCount(postId: post.id!, completion:  totalCount in
                post.isLiked = boolValue

                self.photosArrayString = photosStringArray
                print(photosStringArray) // prints the actual image string
                self.setScrollView()

            )
        )
    


func setScrollView() 
    for  i in stride(from: 0, to: photosArrayString.count, by: 1) 
        var frame = CGRect.zero
        frame.origin.x = self.galleryScrollView.frame.size.width * CGFloat(i)
        frame.origin.y = 0
        frame.size = self.galleryScrollView.frame.size
        galleryScrollView.isPagingEnabled = true

        let newUIImageView = UIImageView()
        print(photosArrayString[i]) // Prints the value again
        let myImage = UIImage(named: photosArrayString[i])! // CRASHES! i = 0 (first item in the array)

        avgBackgroundColorsOfImage.append(myImage.averageColor!)

        newUIImageView.image = myImage
        newUIImageView.frame =  frame

        newUIImageView.contentMode = UIViewContentMode.scaleAspectFit

        newUIImageView.sd_setImage(with: URL(string: self.photosArrayString[i]), completed: nil)


        galleryScrollView.backgroundColor = avgBackgroundColorsOfImage[i]
        galleryScrollView.addSubview(newUIImageView)

        self.galleryScrollView.contentSize = CGSize(width: self.galleryScrollView.frame.size.width * CGFloat(photosArrayString.count),
                                                    height: self.galleryScrollView.frame.size.height)
        pageControl.addTarget(self, action: #selector(changePage), for: UIControlEvents.valueChanged)
    

【问题讨论】:

【参考方案1】:

您要解包的是您刚刚创建的可选UIImage。数组中保存的任何字符串都是有效字符串。但是,它不是资产目录中有效图像的名称。请注意,错误是关于“解包 nil 值”,而不是“数组越界” - 这些是不同的东西。

docs on this initializer 显示了它是如何作为一个可选的 init 函数返回“指定文件的图像对象,如果方法找不到指定的图像,则返回 nil。”

【讨论】:

这解释了很多。谢谢 可以,但是有一个等待时间,现在说 2 分钟。我会接受的:)

以上是关于Nil 同时展开一个实际具有值的可选的主要内容,如果未能解决你的问题,请参考以下文章

Nil 同时展开可选的 IBOutlet 值

UIControl子类-意外地找到nil,同时隐式展开一个可选值

Swift 中的可选值是啥?

“致命错误:在展开可选值时意外发现 nil”,同时调用协议方法

在展开可选值 uint32 swift 时意外发现 nil

具有 NSData 变量的领域对象,在展开可选值时意外发现 nil