Hashable/哈希协议, Arrays/数组 的使用

1. Hashable 模型实现哈希协议

  1.1 实现

/// Identifiable
struct MyCustomModel: Hashable{
    //let id = UUID().uuidString
    let title: String
    func hash(into hasher: inout Hasher) {
        hasher.combine(title)
    }
}

/// 哈希协议: 唯一标识值
struct HashableBootcamp: View {
    // 每个字段都有一个唯一标识
    let data: [MyCustomModel] = [
        MyCustomModel(title: "ONE"),
        MyCustomModel(title: "TWO"),
        MyCustomModel(title: "THREE"),
        MyCustomModel(title: "FOUR"),
        MyCustomModel(title: "FIVE")
    ]
    
    var body: some View {
        ScrollView {
            VStack(spacing: 40) {
                // 每个字段都有一个唯一标识
                // ForEach(data) { item in
                //     Text(item.id)
                //         .font(.headline)
                // }
                
                ForEach(data, id: \.self) { item in
                    Text(item.hashValue.description)
                        .font(.headline)
                }
            }
        }
    }
}

  1.2 效果图:

2. Arrays 数组的使用

  2.1 实现

/// 用户模型
struct UserModel: Identifiable{
    let id = UUID().uuidString
    let name: String?
    let points: Int
    let isVerified: Bool
}

/// 观察者对象
class ArrayModificationViewModel:ObservableObject{
    @Published var dataArray:[UserModel] = []
    @Published var filteredArray:[UserModel] = [] // 筛选数组
    @Published var mappedArray:[String] = [] // 字典数据
    
    init(){
        getUsers()
        updateFilteredArray()
    }
    
    /// 更新过滤数组
    func updateFilteredArray(){
        // sort 排序
        //sortedArray()
        
        // filter 筛选
        //filterArray()
        
        // map 集合
        //mapArray()
        
        // 三种操作一起使用,复杂的操作
        multipleMapArray()
    }
    
    /// 三种操作一起使用,复杂的操作
    func multipleMapArray(){
        mappedArray = dataArray.sorted(by: {$0.points > $1.points})
            .filter({$0.isVerified})
            .compactMap({$0.name})
    }
    
    /// 字典集合 转换 数组  -- 类型 转换 类型
    func mapArray() {
        //mappedArray = dataArray.map { user in
        //     return user.name ?? "Error"
        //}
        
        //mappedArray = dataArray.map({ $0.name ?? "Error" })
        
        // 对于为 nil 的名字不包含在数组中
        //mappedArray = dataArray.compactMap({ user in
        //    return user.name
        //})
        
        mappedArray = dataArray.compactMap({ $0.name })
    }
    
    /// 筛选数组  名字中包含 i :  user.name.contains("i")   验证为 true: user.isVerified
    func filterArray(){
        //filteredArray = dataArray.filter { user in
        //    return user.isVerified
        //}
        
        filteredArray = dataArray.filter({ $0.isVerified })
    }
    
    /// sort 排序数组 (降序/升序)
    func sortedArray(){
        // filteredArray = dataArray.sorted { user1, user2 in
        //    return user1.points < user2.points
        // }
        
        filteredArray = dataArray.sorted(by: { $0.points < $1.points })
    }
    
    /// 获取数据
    private func getUsers(){
        let name = ["Nick", "Chris", nil, "Emily", "Samantha", "Jason", nil, "Lisa", "Steve"]
        let points = [5, 10, 80, 12, 0, 60, 3, 18, 25]
        for index in 0 ..< name.count {
            let isVerified = index % 2 == 0 ? true : false
            let userModel = UserModel(name: name[index], points: points[index], isVerified: isVerified)
            self.dataArray.append(userModel)
        }
    }
}


/// 数组
struct ArraysBootcamp: View {
    // viewModel 层
    @StateObject var viewModel = ArrayModificationViewModel()
    var body: some View {
        ScrollView {
            VStack(spacing: 10) {
                // arrays1 对应 viewModel 中 sortedArray() 和 filterArray()
                // arrays1
                // map 1 对应 viewModel 中 mapArray() 和 multipleArray()
                map1
            }
        }
    }
    
    // 方式二: Map
    var map1: some View{
        ForEach(viewModel.mappedArray, id: \.self) { name in
            Text(name)
                .font(.title)
        }
    }
    
    // 方式一: Array
    var arrays1: some View{
        ForEach(viewModel.filteredArray) { user in
            VStack(alignment: .leading) {
                Text(user.name ?? "Error")
                    .font(.headline)
                
                HStack {
                    Text("Points: \(user.points)")
                    Spacer()
                    if user.isVerified{
                        Image(systemName: "flame.fill")
                    }
                }
            }
            .foregroundColor(.white)
            .padding()
            .background(Color.blue.cornerRadius(10))
            .padding(.horizontal)
        }
    }
}

  2.2 效果图:

    

猜你喜欢

转载自blog.csdn.net/u011193452/article/details/133345506