2017-04-11 20 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; 

スウィフト3.0でこのコードの3行は、表現する方法であるか、どのように私は迅速iOSの迅速なポインタ

+0

struct(CGPoint)をクラスとして扱うことはできません。構造体はポインタをサポートしていません。 – 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パラメーターを取る関数を呼び出すために、メソッドのコアを書き直すことです。

それでは、あなたがあなたの最後の3行に尋ねる削減みましょう:これを行うには

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

を、我々は間接によって別のするCGPointを設定する一般的な方法を必要とし、そのため(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

問題はありません。私はあなたがやっていたことをスウィフトではしない方が良いとアンドレアスに同意しますが、あなたが本当にしなければならない場合、それをどうやって行うのかを示したかったのです。 – matt