2017-04-11 68 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