有没有一种特定的方法在Swift中使用元组作为set元素?

时间:2015-10-07 09:29:15

标签: ios swift set tuples

我想对x-y网格中的坐标对元素进行集合运算。例如。 {(0,0),(1,4),(1,5),(2,3)}与{(2,3),(1,4),(2,6)}的联合= {(0 ,0),(1,4),(1,5),(2,3),(2,6)}遗憾的是我无法找到一种将元组插入Swift的Set命令的方法,因为它说他们做了不符合'hashable'协议。我相信我有一个解决方法,但它涉及很多代码。在我撞到磨刀石之前,有没有一种简单的方法让我失踪?

我是iOS框架的新手,所以我目前正在尝试在Swift中做所有事情。这可能是我的问题......

3 个答案:

答案 0 :(得分:3)

使用内置类型CGPoint,而不是使用元组来表示点。您可以通过扩展CGPoint来扩展import UIKit extension CGPoint: Hashable { public var hashValue: Int { return self.x.hashValue << sizeof(CGFloat) ^ self.y.hashValue } } // Hashable requires Equatable, so define the equality function for CGPoints. public func ==(lhs: CGPoint, rhs: CGPoint) -> Bool { return CGPointEqualToPoint(lhs, rhs) }

let point1 = CGPoint(x: 0, y: 1)
let point2 = CGPoint(x: 0, y: 2)
let point3 = CGPoint(x: 1, y: 1)
let point4 = CGPoint(x: 3, y: 3)
let point5 = CGPoint(x: 3, y: 3)  // Intentionally the same as point4 to see the effect in union and difference.

let set1 = Set([point1, point2 , point5])
let set2 = Set([point4, point3])

let union = set1.union(set2) // -> {{x 0 y 2}, {x 3 y 3}, {x 0 y 1}, {x 1 y 1}}
let difference = set1.intersect(set2) // -> {{x 3 y 3}}

现在CGPoint是Hashable,你可以在套装中使用它。例如:

{{1}}

答案 1 :(得分:0)

你走了:

class Pair {
    var x: Int
    var y: Int
    init(x: Int, y:Int){
        self.x = x
        self.y = y
    }

    func isExisted(inPairs pairs:[Pair]) -> Bool {
        for p in pairs {
            if p.y == self.y && p.x == self.x{
                return true
            }
        }
        return false
    }

    static func union (pairs1: [Pair], pairs2: [Pair]) -> [Pair] {
        var pairsFinal = [Pair]()

        for p in pairs1 {
            pairsFinal.append(p)
        }

        for p in pairs2 {
            if !p.isExisted(inPairs: pairsFinal){
                pairsFinal.append(p)
            }
        }
        return pairsFinal
    }
}

let pari1 = Pair(x: 4, y: 7)
let pair2 = Pair(x: 5, y: 2)
let pair3 = Pair(x: 4, y: 7)
let pair4  = Pair(x: 3, y: 9)

let pairs1 = [pari1, pair2]
let pairs2 = [pair3, pair4]

let f = Pair.union(pairs1, pairs2: pairs2)

这是工会的结果:

enter image description here

答案 2 :(得分:0)

您可以将 def test_register_user(self): with mock.patch('settings.TARGET_SCORES_PER_SECTION', True): self._test_register_user() def _test_register_user(self): 作为struct类型:

Hashable

现在您有了一个可哈希的元组,可以使用常规的struct Point: Hashable { let x: Int let y: Int } 操作:

Set