2017-04-11 1 views
0
CGPoint startPoint1; 
CGPoint startPoint2; 
CGPoint startPoint3; 
CGPoint startPoint4; 

- (void)Method { 
    CGPoint* startPoint = NULL; 

    if (panGesture.view == ...) { 
     startPoint = &startPoint1; 
    } else if (panGesture.view == ...) { 
     startPoint = &startPoint2; 
    } 

    if (panGesture.state == UIGestureRecognizerStateBegan) { 
     *startPoint = [panGesture locationInView:...] 
    } else if (panGesture.state == UIGestureRecognizerStateChanged) { 
     CGPoint endPoint = [panGesture locationInView:...]; 
     *startPoint = endPoint; 
    } 
} 

CGPoint* startPoint = NULL; 
startPoint = &startPoint1; 
*startPoint = endPoint; 

이 세 가지 라인 표현하는 방법입니다 아니면 내가이 신속아이폰 OS 빠른 포인터 스위프트 3.0의 코드

+0

struct (CGPoint)를 클래스로 처리 할 수 ​​없다. Struct는 포인터를 지원하지 않습니다. – Lumialxk

답변

0

. 나는 코드를 단순화했지만, 당신은 그것을 얻을 것이라고 생각한다 :

var points = [CGPoint(), CGPoint()] 
enum indexEnum:Int { 
    case startPoint = 0 
    case endPoint = 1 
} 

func method() { 
    var inx:indexEnum 

    if (1==1) { 
     inx = .startPoint 
    } else { 
     inx = .endPoint 
    } 

    if (2==2) { 
     points[inx.rawValue] = CGPoint(x:10,y:10) 
    } else { 
     points[inx.rawValue] = CGPoint(x:20,y:20) 
    } 
} 
+0

당신의 도움에 감사드립니다, 나는 당신의 제안에 따라 나의 질문을 해결했다. – Snow

0

에 위의 코드를 작성 어떻게 문제는 스위프트가 C의 의미에서 포인터를하지 않는다는 것입니다. 글쎄요, 일종의,하지만 당신이하려는 일을하기 위해 그들을 부르는 것이 가치가 없습니다. 가장 간단한 방법은 inout 매개 변수를 사용하는 함수를 호출하도록 메소드의 핵심을 다시 작성하는 것입니다.

그래서 당신이 당신의 마지막 세 줄에 대해 물어 감소 보자 :

CGPoint* startPoint = NULL; 
startPoint = &startPoint1; 
*startPoint = endPoint; 

우리가 간접적으로 다른 한 CGPoint를 설정하는 일반적인 방법이 필요합니다, 그렇게하기를, (A func로 표현이 있기 때문에 inout 매개 변수를 사용하는 유일한 방법입니다. 그것이 진정으로 일반적으로, 우리는뿐만 아니라이 일반적인 할 수 있도록하기 위해, 우리는 혼자 CGPoint에 국한하지 않는 :

func setByIndirection<T>(_ thing1 : inout T, to thing2: T) { 
    thing1 = thing2 
} 

을 그리고 지금 우리는 당신이하라는 메시지가 정확히 무엇을하고, 그것을 테스트 할 수

var startPoint = CGPoint.zero 
let endPoint = CGPoint(x:5, y:5) 
setByIndirection(&startPoint, to: endPoint) 
print(startPoint) // 5,5 

inout 매개 변수를 사용하면 코드가 설정하려고하는 CGPoint의 "포인터"를 함수에 전달할 수 있습니다.이 코드는 핵심 요소입니다.

원본 endPoint을 "손상"시키려면 setByIndirection을 쓸 필요가 없습니다. 당신은 내장 swap 사용할 수 있습니다 신속, 나는이 열거 형과 배열을 사용

var startPoint = CGPoint.zero 
var endPoint = CGPoint(x:5, y:5) 
swap(&startPoint, &endPoint) 
+0

도와 주셔서 감사합니다. 그래서 많이 배웠습니다 – Snow

+0

문제 없습니다. Andreas와 동의합니다. Swift에서 모든 일을하지 않는 것이 더 낫다는 것에 동의하지만, 실제로해야한다면 어떻게 할 수 있는지 보여주고 싶었습니다. – matt

관련 문제