如何使用Swift函数返回的值

时间:2016-10-09 22:34:14

标签: swift function

我正在尝试使用Swift功能在视图的中心放置一个圆圈,因此无论屏幕大小如何,它始终位于中心。我可以在由一组任意x和y值定义的点处绘制圆,但我需要函数来提供这些值。

我创建了一个名为screenCentre()的函数来读取并返回两个作为中心坐标的参数。然而,Xcode警告说

“Result of call to screenCentre() is unused”

我已经完成Swift tutorials on functions and closures并了解如何将参数传递给函数但我仍然不清楚如何使用此函数返回的值。

这是我的代码:

import UIKit

class ViewController: UIViewController {

   let radius = CGFloat(20)
   let fillColour  = UIColor.clear.cgColor
   let lineColour  = UIColor.red.cgColor
   let lineWidth  = 1.0

   var x: CGFloat?
   var y: CGFloat?

   override func viewDidLoad() {
       super.viewDidLoad()

       screenCentre()
       print(screenCentre())

      // arbitrary set of coordinates used to draw circle

      circle(x: 150, y: 170)

   }

   func screenCentre() -> (x: CGFloat, y: CGFloat)
   {
      return (self.view.bounds.size.width / 2, self.view.bounds.size.height / 2)
   }

   func circle(x: CGFloat, y: CGFloat) {
       let circlePath = UIBezierPath(arcCenter: CGPoint(x: x,y: y), radius: radius, startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true)

       let shapeLayer          = CAShapeLayer()
       shapeLayer.path         = circlePath.cgPath

       shapeLayer.fillColor    = fillColour
       shapeLayer.strokeColor  = lineColour
       shapeLayer.lineWidth    = CGFloat(lineWidth)

       view.layer.addSublayer(shapeLayer)
   }
}

更新

通过声明一个常量,我可以使用此函数返回的值。 Sam_M和Kevin Bunarjo回答了这个问题。

然而Daniel T和PEEJWEEJ都发现了一个我没有认识到的相关问题。一旦我应用了fixits,Daniel T提供的扩展解决方案现在为我提供了一种围绕中心旋转屏幕的方法。所以我把它标记为最佳答案。感谢所有贡献的人。

这是更新的代码。

    let centre = UIScreen.main.centre
    circle(x: centre.x, y: centre.y)
}

func screenCentre() -> CGPoint {
    return CGPoint(x: UIScreen.main.bounds.midX, y: UIScreen.main.bounds.midY)
}

5 个答案:

答案 0 :(得分:2)

您的screenCentre()功能无法在viewDidLoad中使用,因为view尚未调整到屏幕大小,因此其中心不在屏幕中间。< / p>

请改用:

func screenCentre() -> CGPoint {
    return CGPoint(x: UIScreen.mainScreen().bounds.midX, y: UIScreen.mainScreen().bounds.midY)
}

请注意,我使用的是CGPoint而不是元组,但效果是一样的。此外,上述功能不需要在您的视图控制器或任何其他类中,因为它不引用self。它可以是一个全局函数。

由于Swift风格指南鼓励在全局函数上创建方法,您可能更喜欢将函数放在这样的扩展中:

extension UIScreen {
    var centre: CGPoint {
        return CGPoint(x: bounds.midX, y: bounds.midY)
    }
}

可以这样调用:

let centre = UIScreen.mainScreen().centre
print(centre)

答案 1 :(得分:1)

在ViewDidLoad方法中,您只调用方法,但不存储返回的值。您需要做的就是创建一个变量并将其分配给函数调用。

示例:

let center = screenCentre()
print(center)

现在,变量中心将包含屏幕中心的坐标。在后续代码中,您可以像使用任何其他变量一样使用中心。

答案 2 :(得分:1)

您的screenCenter函数返回包含两个CGFloat值的元组。这些值标记为xy,因此您可以在查询函数的返回值时按名称访问它们。

override func viewDidLoad() {
    super.viewDidLoad()

    let center = screenCentre()
    //center.x contains the x value returned from screenCenter
    //center.y contains the y value returned from screenCenter

    circle(x: center.x , y: center.y)
}

答案 3 :(得分:0)

如果您不需要返回值,则可以使用_来放弃函数的返回值。

let _ = screenCentre()

答案 4 :(得分:0)

首先,UIViews have a center attribute,所以你不需要计算它。

其次,如果使用viewDidLoad更改行为,行为可能会不一致,并且不会对大小/旋转的任何更改做出反应。

我建议制作一个UIView的子类来管理绘制圆圈并做这样的事情:

class ViewController: UIViewController {

    var circle: CircleView?

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        centerCircle()
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        centerCircle()
    }

    func centerCircle() {
        circle?.center = self.view.center
    }
}