Как использовать значения, возвращаемые функцией 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
}
}