Как использовать значения, возвращаемые функцией Swift

Я пытаюсь использовать функцию Swift для размещения круга в центре представления, поэтому он всегда находится в центре, независимо от размера экрана. Я могу нарисовать круг в точке, заданной набором произвольных значений x и y, но мне нужна функция для подачи этих значений.

Я создал функцию с именем screenCentre() для чтения и возврата двух параметров, которые являются центральными координатами. Однако Xcode предупреждает, что

"Result of call to screenCentre() is unused"

Ive проработал Swift-учебники по функциям и закрытию и понял, как передавать аргументы функции, но я до сих пор не понимаю, как использовать значения возвращенный этой функцией.

Вот мой код:

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)
   }
}

UPDATE

Объявив константу, я могу использовать значения, возвращаемые этой функцией. Sam_M и Кевин Бунархо ответили на вопрос, заданный.

Однако Daniel T и PEEJWEEJ идентифицировали связанную проблему, которую я не узнал. Как только я применил исправления, расширение, предлагаемое 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)
}

Ответы

Ответ 1

Ваша функция screenCentre() не будет работать в viewDidLoad, потому что view еще не настроен на экран, поэтому его центр не находится посередине экрана.

Используйте это вместо:

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)

Ответ 2

В вашем методе ViewDidLoad вы вызываете метод только, но не сохраняете возвращаемые значения. Все, что вам нужно сделать, чтобы исправить это, - это создать переменную и назначить ее вызову вашей функции.

Пример:

let center = screenCentre()
print(center)

Теперь центр переменных будет содержать координаты вашего экрана. И в следующем коде вы можете использовать центр, как и любой другой переменной.

Ответ 3

Ваша функция screenCenter возвращает кортеж, содержащий два значения CGFloat. Эти значения помечены x и y, чтобы вы могли получить к ним доступ по имени при запросе возвращаемого значения функций.

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)
}

Ответ 4

Одна вещь, которую вы можете сделать, это использовать _ для отбрасывания возвращаемого значения из функции, если вам не нужно возвращать значение.

let _ = screenCentre()

Ответ 5

Прежде всего, UIViews имеют атрибут центра, поэтому вам не нужно его вычислять.

Во-вторых, поведение может быть непоследовательным, если изменить его с помощью viewDidLoad и не будет реагировать на какие-либо изменения размера/вращения.

Я бы рекомендовал сделать subClass 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
    }
}