如何使用泛型数组 - SwiftUI

How to use a generic array - SwiftUI

您好,我正在创建一个需要考虑数组进行操作的组件。

我创建了一个模型来显示这样的数组

struct FeaturedWorksModel: Identifiable {
    var id = UUID()
    var image: String
    var title: String
}

var featuredWorksItems: [FeaturedWorksModel] = [
    FeaturedWorksModel(image: "slider1", title: "TAGLIO CREATIVO"),
    FeaturedWorksModel(image: "slider4", title: "LOREM IPSUM"),
    FeaturedWorksModel(image: "slider3", title: "NEQUE EST DOLOR"),
    FeaturedWorksModel(image: "slider2", title: "CONSECTETUR, INTEGER ERAT AUGUE ")
]

现在我的组件也可以与其他数组一起使用,我想知道如何在组件初始化参数中定义一个通用数组,以便重用组件,甚至引用我正在使用的数组以外的数组这一刻

这是我正在使用的组件,我必须将引用数组传递给它才能工作

struct SmoothPager: View {
    
    @Binding var offset: CGPoint
    
    var body: some View {
        HStack(spacing: 10) {
            ForEach(featuredWorksItems.indices) { works in
                Capsule()
                    .fill(getIndex() == works ? .white : .gray)
                    .frame(width: getIndex() == works ? 15 : 7, height: 7)
            }
            
        }
        .overlay(
        Capsule()
            .fill(.white)
            .frame(width: 15, height: 7)
            .offset(x: getOffset())
        , alignment: .leading
        )
    }
    
    func getIndex()-> Int {
        let index = Int(round(Double(offset.x / screen.width)))
        return index
    }

    func getOffset()-> CGFloat {
        let progress = offset.x / screen.width
        return 17 * progress
    }
}

在这种情况下,我使用的是 featuredWorksItems.indices,但我想让该组件也可与其他类似数组一起使用。在此结构中传递通用数组参数的最佳方式是什么?

你的意思是像

struct SmoothPager<Element: Identifiable>: View {
  @Binding private var offset: CGPoint
  private let elements: [Element]

  init(elements: [Element], offset: Binding<CGPoint>) {
    self.elements = elements
    self._offset = offset
  }

  var body: some View {
    HStack(spacing: 10) {
      ForEach(elements.indices) { works in
        Capsule()
          .fill(getIndex() == works ? .white : .gray)
          .frame(width: getIndex() == works ? 15 : 7, height: 7)
      }

    }
    .overlay(
      Capsule()
        .fill(.white)
        .frame(width: 15, height: 7)
        .offset(x: getOffset())
      , alignment: .leading
    )
  }

  func getIndex()-> Int {
    let index = Int(round(Double(offset.x / UIScreen.main.bounds.width)))
    return index
  }

  func getOffset()-> CGFloat {
    let progress = offset.x / UIScreen.main.bounds.width
    return 17 * progress
  }
}