Chameleon
Chameleon

Reputation: 1608

Array.contains(where:) to return Array item that returned true

In Swift, say we have a draggable UIButton that can be dropped on a number of Views. What is the swiftest way to gain reference to said View?

let Array: [UIViews] = [View1, View2, View3, View4, View5, View6]

func oneFingerSwipe(_ gesture:UIPanGestureRecognizer){
    let pointInView = gesture.location(in: gesture.view)

    switch(gesture.state){
            case .changed:
                Button.center = CGPoint(x: pointInView.x, y: pointInView.y)
            case .ended:
                if Array.contains(where: { $0.frame.contains(pointInView)}) {
                    // do something to said View($0) through either Array[index] or reference to the View($0)
                }

//INSTEAD of long winded

                if View1.frame.contains(pointInView) {
                    //do work to View1
                } else if View2.frame.contains(pointInView) {
                    //do work to View2
                } else if View3.frame.contains(pointInView) {
                    //do work to View3
                } else if View4.frame.contains(pointInView) {
                    //do work to View4
                } else if View5.frame.contains(pointInView) {
                    //do work to View5
                } else if View6.frame.contains(pointInView) {
                    //do work to View6
                }
            default: break
    }
}

Upvotes: 3

Views: 55

Answers (1)

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726609

You should be able to filter the array of views and take the first matching one using first(where:) function:

if let targetView = Array.first(where: {$0.frame.contains(pointInView)} ) {
    ...
}

Upvotes: 3

Related Questions