2017-08-24 18 views
1

私はユーザーの平均速度を表示しようとしています。 と私はまた、配列の最高値を表示したいと思います。平均速度と配列 "CoreLocation"の最高速度

私はフォーラムを検索し、これを達成するための多くの方法を見つけましたが、何も機能しません。

私は何をしようとしたことはここで// top speed// average speed

である私のコードです:あなただけのクラスとして定義されるべき配列を自分の中に全ての速度の更新を保存する必要が

// Location 
let manager = CLLocationManager() 

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    let location = locations[0] 
    let span = MKCoordinateSpanMake(0.015, 0.015) 
    let myLocation = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 

    let region = MKCoordinateRegionMake(myLocation, span) 
    mapView.setRegion(region, animated: true) 
    self.mapView.showsUserLocation = true 

    // Altitude 
    let altitude = location.altitude 
    let altitudeNoDecimals = Int(altitude) 

    altitudeLabel.text = "\(altitudeNoDecimals)" 

    // m/s to km/h 
    let kmt = location.speed * (18/5) 
    let kmtLabel = Int(kmt) 
    statusLabel.text = "\(kmtLabel)" 

    // Top Speed 
    // let maxSpeed: Int = (kmtLabel as AnyObject).value(forKeyPath: "@maxSpeed.self") as! Int 
    // topSpeedLabel.text = "\(maxSpeed)" 

    let max = location.toIntMax() 
    topSpeedLabel.text = "\(max)" 

    // Average speed 
    var avg: Double = (list as AnyObject).valueForKeyPath("@avg.self") as Double 
    averageSpeed.text = "\(avg)" 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    manager.delegate = self 
    manager.desiredAccuracy = kCLLocationAccuracyBest 
    manager.requestWhenInUseAuthorization() 
    manager.startUpdatingLocation() 
} 

答えて

0

インスタンスのプロパティを使用して、平均速度と最高速度の両方を計算プロパティとして定義できるため、場所の更新を受信するたびに手動で更新する必要はありません。あなたがラベルに書き込む前にというかにそれらを追加する前にそれを行うことができますどちらか、ということが必要な場合、私は、キロ/ hにavgSpeedまたはtopSpeedのいずれかの単位を変更していない心の中で

let manager = CLLocationManager() 
var speeds = [CLLocationSpeed]() 
var avgSpeed: CLLocationSpeed { 
    return speeds.reduce(0,+)/Double(speeds.count) //the reduce returns the sum of the array, then dividing it by the count gives its average 
} 
var topSpeed: CLLocationSpeed { 
    return speeds.max() ?? 0 //return 0 if the array is empty 
} 

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    let location = locations[0] 
    ... 

    speeds.append(contentsOf: locations.map{$0.speed}) //append all new speed updates to the array 

    // m/s to km/h 
    let kmt = location.speed * (18/5) 
    let kmtLabel = Int(kmt) 
    statusLabel.text = "\(kmtLabel)" 

    // Top Speed 
    topSpeedLabel.text = "\(topSpeed)" 

    // Average speed 
    averageSpeed.text = "\(avgSpeed)" 
} 

ベアアレイ。

+0

なぜ、下の投票が、コメントしてください。 –

+1

私のコードとコメントの説明にあなたの答えを実装しようと努力してくれてありがとう。それは魅力のように働いた! –

+0

私は助けてくれると嬉しいです。 –

関連する問題