从图像数组中移除图像-Swift

3

我有一个图像数组 var images: NSArray! = []。我的数组中最多可以有5张图片。我想要能够处理任意数量的图片,因此我将它们提取出来。

guard let imageOne = images[0] as? UIImage else { return }
guard let imageTwo = images[1] as? UIImage else { return }
guard let imageThree = images[2] as? UIImage else { return }
guard let imageFour = images[3] as? UIImage else { return }
guard let imageFive = images[4] as? UIImage else { return }

我希望每个索引都是可选的,这样我就可以使用imageOne或imageOne和imageTwo,但当我尝试使用少于5张图片时,会出现索引错误。如何使每个索引变成可选项,以便它不再与数组分组,并且每个索引都成为自己的图像。
我最初有一个数组,因为我有一个自定义的UIImagePicker,只接受数组,但我想上传图片到Firebase,而Firebase不接受数组,所以我必须从数组中提取图像。
根据下面的建议答案,我对我的代码进行了如下修改:
        for (counter, img) in images.enumerated(){
                if counter == 0 {

                    func uploadImage(image: UIImage){
                        var randomName = randomStringWithLength(length: 5)
                        let imageData = UIImageJPEGRepresentation(imageOne!, 1.0)


                        let uploadRef = FIRStorage.storage().reference().child("images/\(randomName).jpg")
                        uploadRef.put(img as! UIImage, metadata: nil) { metadata,
                            error in
                            if error == nil {
                                print("successfully uploaded Image")

                                self.imageFileName = "\(randomName as String).jpg"

                                randomName = randomStringWithLength(length: 5)

                                let postObject: Dictionary<String, Any> = [
                                    "image" : self.imageFileName,

                                ]

                                FIRDatabase.database().reference().child("posts").child(self.loggedInUser!.uid).child(key).setValue(postObject)

                                print("Posted to Firebase. ")

                            } else{
                                print("Error uploading image")

                            }}

                    }
 if let pickedImage = img as?
                            UIImage{
                            uploadImage(image: pickedImage)

                                    }

                }
    }

现在,我该如何检查选择了多少张图片并在每个if counter == num中调用函数?

2
你已经将图片存储在数组中,为什么需要将它们复制成变量?显然,如果数组中的元素少于5个,并且你访问索引[4],将会出现错误。 - kpie
@kpie,这就是我想要避免的。我希望能够访问任何索引而不会出现错误。 - juelizabeth
如果您想使用超过5张图片,为什么不将数组定义为[UIImage?]? - DanielEdrisian
@SahandTheGreat 我想使用不超过5张图片。 - juelizabeth
2
这个问题非常不清楚。如果您想使用少于五张图片,请加载一个包含少于五张图片的数组。更不用说,将数组元素移动到它们自己的变量中,完全消除了拥有一个数组的需求/目的。也许可以提供更多信息,说明为什么需要以这种方式访问您的图片? - Jacob Boyd
4
没什么意义,对不起。 - DanielEdrisian
2个回答

2
尽管我不赞同你的做法,但这会回答你的问题:
首先将var images: NSArray! = []更改为var images: NSMutableArray! = []
while images.count < 5{
    images.addObject(UIImage())
}
guard let imageOne = images[0] as? UIImage else { return }
guard let imageTwo = images[1] as? UIImage else { return }
guard let imageThree = images[2] as? UIImage else { return }
guard let imageFour = images[3] as? UIImage else { return }
guard let imageFive = images[4] as? UIImage else { return }

4
这确实回答了你的问题。但是你@OP应该真正重新考虑一下你对这段代码片段的实现。如果我在代码库中遇到这个,我会感到非常困惑。 - Jacob Boyd
我得到了错误:类型为'NSArray'的值没有成员'append'。 - juelizabeth
1
我有点echo Jacob的意见,但这里解释了:https://dev59.com/m4Tba4cB1Zd3GeqP75K9 我会编辑帖子 :) - bearacuda13
1
juelizabeth,请你自己好好思考一下,重新审视你的方法。 - DanielEdrisian
有没有办法我可以把我的视图控制器发送给你,让你看一下? - juelizabeth
显示剩余8条评论

1
for img in imgs  {
    //do something for each img
}

不要将单个数组成员复制到变量中。通过遍历列表,您可以对列表中的每个图像执行操作,而不会出现任何索引错误。如果您需要对每个图像进行不同的处理,则可以使用带有计数器的条件分支。
let counter = 0
for img in imgs  {
    if counter == 0 {
        // do something for first img
    }
    if counter == 1 {
        // do something for second img
    }
    //...
    if counter == 4 {
        // do something for fifth img
    }
    counter += 1
}

不需要手动管理“计数器”索引。只需使用for(counter,img)in imgs.enumerated()即可。而且不要只是一堆“if”,使用“else if”以便它不必进行不必要的评估。 - NRitH
@NRitH 或者使用 switch 语句...但就像你所说的那样,只需使用 for (index, element) in imgs.enumerated(){} 这种方法会更好。 - Jacob Boyd
我对switch的唯一问题是它必须是全面的,而且由于您无法真正用常规的Int实现全面性,因此需要一个default情况,这只会增加不必要的错误处理。 - NRitH
@Kpie,我使用了你的答案并更新了我的问题。我该如何遍历else if语句以查看选择了多少个图像,然后在其中调用函数? - juelizabeth

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