Использование неразрешенного идентификатора 'timeR' -> Вызов вложенной функции - PullRequest
0 голосов
/ 06 апреля 2020
import UIKit

class ViewController: UIViewController {

    var timer:Timer?
    @objc func onTimerFires() {
        var timeLeft:Int = timeR()

        timeLeft -= 1
        print("\(timeLeft) seconds left")

        if timeLeft <= 0 {
            timer!.invalidate()
            timer = nil
        }
    }

    @IBAction func hardnessSelected(_ sender: UIButton) {

        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(onTimerFires), userInfo: nil, repeats: true)

        let eggTimes:[String:Int] = [
            "Soft":5,
            "Medium":7,
            "Hard":12,
        ]

        let hardness = sender.currentTitle!

        func timeR() -> Int {
            if eggTimes[hardness]! == 5{
                return(120)
            }
            else if eggTimes[hardness]! == 7{
                return(420)
            }
            else {
                return(720)
            }
        }
        print(eggTimes[hardness]!)
    }
}

Я не могу вытащить вложенную функцию, есть ли способ сделать внутренний вызов функции. Спасибо.

enter image description here

1 Ответ

1 голос
/ 06 апреля 2020

Функция timeR определена как локальная функция внутри hardnessSelected, поэтому она видна только внутри своей охватывающей функции hardnessSelected.

Если вы хотите передать значение hardness в onTimerFires, вам нужно сохранить его в свойстве экземпляра ViewController, к которому у onTimerFires и hardnessSelected есть доступ. Затем переместите timeR в onTimerFires и передайте значение hardness.

class ViewController: UIViewController {

    private let eggTimes:[String:Int] = [
        "Soft":5,
        "Medium":7,
        "Hard":12,
    ]

    var hardness: String?

    var timer:Timer?

    @objc func onTimerFires() {
        func timeR(hardness: String) -> Int {
            if eggTimes[hardness] == 5 {
                return 120
            } else if eggTimes[hardness] == 7{
                return 420
            } else {
                return 720
            }
        }

        var timeLeft:Int = timeR(hardness: hardness ?? "")

        timeLeft -= 1
        print("\(timeLeft) seconds left")

        if timeLeft <= 0 {
            timer!.invalidate()
            timer = nil
        }
    }

    @IBAction func hardnessSelected(_ sender: UIButton) {

        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(onTimerFires), userInfo: nil, repeats: true)

        hardness = sender.currentTitle

        print(time)
    }
}
...