【问题标题】:Running Pace Calculator in Swift在 Swift 中运行配速计算器
【发布时间】:2015-10-04 00:58:10
【问题描述】:

我是 Swift 的新手。我在 Playground 中创建了一个跑步速度计算器作为实验,它运行良好,但我很难弄清楚如何将它连接到 UI。

我目前特别纠结的事情:

  • 将文本字符串转换为 Int 标签
  • 进行计算的函数是否在 IBAction 中?

游乐场代码

import UIKit

func PaceCalculator (minutes:Double, seconds:Double, distance:Double) -> Double{
    return ((minutes*60) + seconds) / distance
}

var paceInSeconds = PaceCalculator(28, 26, 10.1)
var paceInMinutes = paceInSeconds / 60
var roundedMinutes = Double(floor(paceInMinutes))
var decimalSeconds = paceInMinutes - roundedMinutes
var intPace = Int(floor(roundedMinutes))
var seconds = Int(floor(decimalSeconds * 60))

println("Your average pace is \(intPace):\(seconds)/km")

不完整的 Swift 代码

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func calculatePaceButton(sender: UIButton) {

    }

    @IBOutlet weak var minutesTextField: UITextField!
    @IBOutlet weak var distanceTextField: UITextField!
    @IBOutlet weak var paceLabel: UILabel!

}

故事板

免责声明:我也没有编程经验。所以对行话和解释要温柔。)

【问题讨论】:

    标签: swift xcode6 calculator


    【解决方案1】:

    希望这对你有用:

    您没有将secondsTextField 添加为IBOutlet,请也检查一下。

    class ViewController: UIViewController {
    
        @IBOutlet weak var minutesTextField: UITextField!
        @IBOutlet weak var distanceTextField: UITextField!
        @IBOutlet weak var paceLabel: UILabel!
        @IBOutlet weak var secondsTextField: UITextField!
        @IBAction func calculatePaceButton(sender: UIButton) {
            var paceInSeconds = PaceCalculator((minutesTextField.text as NSString).doubleValue, seconds: (secondsTextField.text as NSString).doubleValue, distance: (distanceTextField.text as NSString).doubleValue)
            var paceInMinutes = paceInSeconds / 60.0
            var roundedMinutes = Double(floor(paceInMinutes))
            var decimalSeconds = paceInMinutes - roundedMinutes
            var intPace = Int(floor(roundedMinutes))
            var seconds = Int(floor(decimalSeconds * 60))
            paceLabel.text = "\(intPace)"
        }
    
        func PaceCalculator (minutes:Double, seconds:Double, distance:Double) -> Double{
            return ((minutes*60) + seconds) / distance
        }
    }
    

    【讨论】:

    • 是的,完美!谢谢阿什。你能解释一下下面这段是什么意思吗?尤其是 NSString 和 .doubleValue。 minutesTextField.text as NSString).doubleValue 是的,我发现我没有添加 IBOutlet。)
    • 在 Swift 2 中,它们直接允许转换 Double(String),但一般来说,这种语法适用于所有版本。 @SteynViljoen 希望对您有所帮助
    • 感谢您的帮助!欣赏它。
    【解决方案2】:

    在这里我想分享我的计算速度的解决方案。计算基于时间和位置的输入,更通用和有用。

    typealias ShortFullTupleStrings = (short: String, full: String)
    class PaceCalculator {
        private static func relatedTimeString(
          for value: TimeInterval)
          -> ShortFullTupleStrings?
        {
          let fm = DateComponentsFormatter()
          switch abs(value) {
          case 0 ..< 24*3600: // within one day
            fm.allowedUnits = [.year, .day, .hour, .minute, .second]
          case 24*3600 ..< 24*3600*10: // within 1-10 days
            fm.allowedUnits = [.year, .day, .hour, .minute]
          case 24*3600*10 ..< 24*3600*365: // within 10-365 days
            fm.allowedUnits = [.year, .day, .hour]
          default: // within 365-1000 days
            fm.allowedUnits = [.year, .day]
          }
          fm.unitsStyle = .short
          let short = fm.string(from: value)
          fm.unitsStyle = .full
          let full = fm.string(from: value)
          if let short = short, let full = full {
            return (short, full)
          } else {
            return nil
          }
        }
    
        static var isMetric: Bool {
          let locale = NSLocale.current
          let metricSystem = locale.usesMetricSystem
          return metricSystem
        }
    
        static func paceFrom( _
          dt1: Date, to dt2: Date,
          distanceFrom loc1: CLLocation, to loc2: CLLocation) -> 
        ShortFullTupleStrings?
        {
          let timeInterval = dt2.timeIntervalSince(dt1)
          let dist = loc2.distance(from: loc1)
          let pace: ShortFullTupleStrings?
          if !dist.isZero {
            let paceV: TimeInterval
            if isMetric {
                paceV = timeInterval / (dist / 1000.0)
            } else {
                paceV = timeInterval / (dist / 1609.344)
            }
            pace = relatedTimeString(for: paceV)
          } else {
            pace = nil
          }
          return pace
        }
    }
    

    relatedTimeString 是一个辅助函数,用于获取格式为 # yrs、#days、#hrs、#min、#sec 和 #years 的完整格式的时间字符串,...,具体取决于没有零值。例如,短格式为 6 分 5 秒,完整格式为 6 分 5 秒。

    这样,func 更加通用,并支持本地化和可访问性。

    【讨论】:

      猜你喜欢
      • 2015-10-11
      • 2016-04-12
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多