Swift:array[0] vs array.first.为什么他们对我们的描述不同?

ogsagwnx  于 2024-01-05  发布在  Swift
关注(0)|答案(2)|浏览(189)

我在LazyVGrid中有ScrollView。里面有出现的forEach循环创建视图。用户可以在此scrollView中创建新项目。当使用ScrollViewReader创建新视图时,我观察到自定义Bool属性的更改,该属性使用

  1. .onChange(of: boolProperty) { _ in
  2. withAnimation {
  3. reader.scrollTo(viewModel.items.[0].id, anchor: .top)
  4. }
  5. }

字符串
一切正常,但如果我像这样将[0]更改为.first

  1. .onChange(of: boolProperty) { _ in
  2. withAnimation {
  3. reader.scrollTo(viewModel.items.first?.id, anchor: .top)
  4. }
  5. }


行为是不一样的,视图只滚动一点点,而不是顶部

qco9c6ql

qco9c6ql1#

first返回一个可选类型(当数组为空时返回nil),因此viewModel.items.first?.id的类型为ID?,其中ID的类型为id
另一方面,viewModel.items.[0].id是非可选类型ID。下标返回非可选类型,并在数组为空时崩溃。
scrollTo滚动到滚动视图中的一个视图,该视图具有您指定的ID。您的视图可能具有 non-optional ID,因此传递一个可选类型的值将永远不会匹配您拥有的任何视图,因此不会滚动到所需的视图。

jecbmhm3

jecbmhm32#

这是不同的,items[0].id是non-optinal的,也就是说,一个Int。而items.first?.id是相反的,Optional<Int>。基本上,它不会匹配,这就是为什么滚动不工作。试试这个:

  1. withAnimation {
  2. if let firstID = viewModel.items.first?.id {
  3. reader.scrollTo(firstID, anchor: .top)
  4. }
  5. }

字符串

相关问题