2017-04-11 65 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這三行代碼是如何表達我怎麼寫上面的代碼進入迅捷的iOS迅速指針

+0

你不能把結構(CGPoint)作爲類。 Struct不支持指針。 – Lumialxk

回答

0

在迅速的,我會用枚舉和數組。我簡化了代碼的一個litte,但我想你會得到它:

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設置到另一個間接的,表示爲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的「指針」,CGPoint的值將被設置,這就是你的代碼試圖完成的核心。

如果你願意「損害」你原來的endPoint,你甚至不需要寫setByIndirection;您可以使用內置的swap

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

謝謝你的幫助,所以我學到了很多 – Snow

+0

沒問題。我同意安德烈亞斯的觀點:最好不要在斯威夫特所做的所有事情中做所有事情,但我想告訴你如果你真的必須這樣做的話。 – matt