如何接受CGFloat或CGFloats数组作为函数参数?

时间:2017-05-16 22:22:42

标签: swift function autolayout arguments variadic-functions

我有一个自动布局便利功能,可以将视图叠加在一起。对于我的间距参数,我想允许:

  • 视图之间的间距为零
  • 或单个CGFloat(所有视图均匀分布)
  • CGFloat s的数组(视图之间的不同空格)

但是,我不确定如何定义这个论点。

// Ambiguous
func myconstrainer(_ views : [UIView], spacing : CGFloat = 0){}
func myconstrainer(_ views : [UIView], spacing : [CGFloat]? = nil){}

// Messy
func myconstrainer(_ views : [UIView], spacingA : CGFloat = 0, spacingB: [CGFloat]? = nil){}

3 个答案:

答案 0 :(得分:2)

我将如何做到这一点:

myconstrainer([view1, view2, view3], spacing: 123.0)
myconstrainer([view1, view2, view3], spacings: [1, 2, 3])

致电网站:

docker pull microsoft/windowsservercore:10.0.14393.321
docker tag microsoft/windowsservercore:10.0.14393.321 microsoft/windowsservercore
docker run microsoft/windowsservercore hostname
69c7de26ea48

答案 1 :(得分:2)

如果没有诉诸泛型,这将带来(我认为不必要的)复杂性的世界,你不能做你想做的事情,因为需要定义参数的类型以从类型安全中获益Swift是旨在提供。

为什么不简单地将间距定义为CGFloats数组(如第二个声明中所示),如果spacing.count == 1,则默认为第一种情况?

func myconstrainer(_ views : [UIView], spacing : [CGFloat]?) {
    if spacing.count == 1 {
        // all views spaced evenly code
    }
    else {
        // different spaces between views code
    }
}

PS(您不需要将可选参数设置为nil)

答案 2 :(得分:2)

你也可以尝试可变数量的参数

func myconstrainer(_ views: [UIView], spacing: CGFloat...) {
    myconstrainer(views, spacing: spacing)
}

并提供一个简单的重载来处理数组

func myconstrainer(_ views: [UIView], spacing: [CGFloat]) {
    // Implementation...
}

因此,当使用偶数间距时,您不需要在括号中放置单个元素

致电网站:

myconstrainer([view1, view2, view3])
myconstrainer([view1, view2, view3], spacing: 123)
myconstrainer([view1, view2, view3], spacings: 1, 2, 3)
myconstrainer([view1, view2, view3], spacings: [1, 2, 3])

一些非明显的注释:

  • 通过使用零参数调用CGFloat...可以很好地覆盖默认情况;
  • 并且,由于此参数实际上是数组,我们可以将其转发到没有括号的其他方法。
相关问题