ios Swift如何检查是否遍历了List[String]的最后一项

zpqajqem  于 2023-03-05  发布在  iOS
关注(0)|答案(6)|浏览(164)

我需要检查我什么时候遍历了最后一项。我不能把该行放在我的for循环之后,因为那样我总是收到一个空列表。我尝试了下面的方法,但是这个方法不起作用:

.observeSingleEvent(of: .value, with: { (snapshot) in
    if snapshot.exists() {
        for rest in snapshot.children.allObjects.count as! [DataSnapshot] {
            let refi = Database.database().reference().child("Users")
            refi.observeSingleEvent(of: .value, with: { (snapshoti) in
                if snapshoti.value as! String == "active"{
                    let userid = rest.key
                    self.someProtocol[rest.key] = self.checksum

                    if self.checksum == self.someProtocol.count-1 {
                        self.sortUsers()
                    } else {
                       
                    }
                    self.checksum = self.checksum+1
                }
            })
        }
    }
xmq68pz9

xmq68pz91#

dr_barto的答案将起作用,但需要进行以下修改:

for (idx, element) in array.enumerated() {
  if idx == array.endIndex-1 {
    // handling the last element
  }
}

从Apple文档:
endIndex是数组的“结束后”位置-即比最后一个有效下标参数大一的位置

wixjitnu

wixjitnu2#

如果你不想使用index,你可以像这样检查元素:

for element in array {
    if element == array.first {
        print("first")
    } else if element == array.last {
        print("last")
    }
}
cs7cruho

cs7cruho3#

EDIT我的答案不起作用,因为(正如注解中指出的)endIndex永远不会匹配从enumerated返回的任何索引值,因为它表示最后一个元素 * 之后的 * 索引。请参阅https://stackoverflow.com/a/53341276/5471218了解如何正确地完成:)

正如评论中所指出的,您应该使用enumerated;给定一个array,可以这样使用它:

for (idx, element) in array.enumerated() {
  if idx == array.endIndex {
    // handling the last element
  }
}
3wabscal

3wabscal4#

也可用作扩展:

extension Array {
    func lastIndex(index: Int) -> Bool {
        index == endIndex-1
    }
}

extension Array where Element : Equatable {
    func isLast(element: Element) -> Bool {
        last == element
    }
}
uurv41yg

uurv41yg5#

对于像我这样的新手在斯威夫特。。我附上了完整的代码。

ref.child("BookShelf").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
        if let datasnap = snapshot.value as? Dictionary<String, Any> {
            for (index,data) in datasnap.enumerated() {
                let book = Book(userid: data.key , dataSnap: data.value as! Dictionary<String, Any>)
                bookShelf.append(book)

                print("index",index)
                print("datasnap.count-1",datasnap.count-1)
                if(index == datasnap.count-1){
                    print("1 bookshelf count getFirebaseData()",bookShelf.count)
                    self.showDashBoard(bookShelf: bookShelf)
                }
            }
            
            //if last data then trigger show
        }
     
    }) { (error) in
        print(error.localizedDescription)
    }
nue99wik

nue99wik6#

尝试此解决方案

.observeSingleEvent(of: .value, with: { (snapshot) in
        if snapshot.exists(){

            for (index,rest) in snapshot.children.allObjects {
                    if index == (snapshot.children.allObjects.count - 1){
                       //yeah finally you are getting the last object :)
                      }
                    }

                })

            }

P.S:假设snapshot.children.allObjects是[数据快照]的数组

相关问题