[Array map,Swift

问题描述 投票:2回答:2

我有一个自定义的规则类。

class Rules: NSCoding {

var x: String?
var y: Double?

override func mapping(map: Map) {
    self.x     <- map["x"]
    self.y     <- map["y"]
}

在我的viewModel中,我需要创建一个对象规则,并将两个数组的元素一一传递。第一个数组由3个字符串组成,第二个数组具有一些Double(大于3!)这是我到目前为止尝试过的:

let xValues = ["String1", "String2", "String3"]
let yValues = [1.0, 2.0, 1.5, 2.5, 5.1, 6.0, 8.0]

let rules = zip(xValues, yValues).map {
    Rules(x: "\($0.0)", y: $0.1)
}

此问题(我想)是我的规则对象具有一些重复的字符串,有时甚至超过了我在xValues数组中的字符串。 (有可能我在其他地方做错了...)

我需要的是传递三个字符串,而另一个Double是不同的,可以说是6 double。

ios arrays swift dictionary nscoding
2个回答
1
投票

为什么不创建规则之前只是删除重复项?

定义通用扩展名以删除重复项:

extension RangeReplaceableCollection {

    func removingDuplicates<E>(keyPath path: KeyPath<Element, E>) -> Self 
        where E: Hashable 
    {
        var seen = Set<E>()
        seen.reserveCapacity(count)
        var new = self
        new.removeAll { element -> Bool in
            if seen.contains(element[keyPath: path]) {
                return true
            } else {
                seen.insert(element[keyPath: path])
                return false
            }
        }
        return new
    }

}

然后在压缩前删除重复项:

let xValues = ["String1", "String2", "String3"].removingDuplicates(keyPath: \.self)
let yValues = [1.0, 2.0, 1.5, 2.5, 5.1, 6.0, 8.0].removingDuplicates(keyPath: \.self)

let rules = zip(xValues, yValues).map {
    Rules(x: $0.0, y: $0.1)
}

花样:您不需要对x参数使用字符串插值,因为参数$0.0已经是String


0
投票

由于zip仅返回两个输入数组都具有值的那些索引的元组,因此,您需要一个方法来填充较小的数组,如下所示:

func zipFill<T, U>(_ arr1: [T], _ arr2: [U]) -> [(T?, U?)] {
    let c1 = arr1.count
    let c2 = arr2.count
    let count = max(c1, c2)

    var result = [(T?, U?)]()

    for i in 0..<count {
        if i < c1 && i < c2 {
            result.append((arr1[i], arr2[i]))
        } else if i >= c1 {
            result.append((nil, arr2[i]))
        } else if i >= c2 {
            result.append((arr1[i], nil))
        }
    }

    return result
}

let xValues = ["String1", "String2", "String3"]
let yValues = [1.0, 2.0, 1.5, 2.5, 5.1, 6.0, 8.0]

let rules = zipFill(xValues, yValues).map {
    Rules(x: $0.0, y: $0.1)
}

print(rules)  
// [ {x "String1", y 1}, {x "String2", y 2}, {x "String3", y 1.5},
//   {x nil, y 2.5}, {x nil, y 5.1}, {x nil, y 6}, {x nil, y 8} ]
© www.soinside.com 2019 - 2024. All rights reserved.