Takahiro Octopress Blog

-1から始める情弱プログラミング

Swiftを使って、位置情報を取得してみよう!

Swiftを使って位置情報を使ってみよう

今日はSwiftを使った位置情報の取得を試してみたいと思います。
今日もObjective-Cの書式と比較しながら進めてみます。

ライブラリのimport

  • Objective-Cの場合
1
2
// ViewController.hファイル
#import <UIKit/UIKit.h>
1
2
3
// ViewController.mファイル
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
  • Swiftの場合
1
2
3
// ViewController.swiftファイル
import UIKit
import CoreLocation

インスタンス変数の宣言

  • Objective-Cの場合
1
2
3
4
5
6
// ViewController.mファイル
@interface ViewController ()

@property (strong, nonatomic) CLLocationManager *lm;

@end
  • Swiftの場合
1
2
3
4
5
6
7
// ViewController.swiftファイル
class ViewController: UIViewController {

  var lm:CLLocationManager?

  .....
}

Delegate Protocolの宣言

  • Objective-Cの場合
1
2
3
4
// ViewController.mファイル
@interface ViewController() <CLLocationManagerDelegate> {
  ......
}
  • Swiftの場合
1
2
3
4
// ViewController.swiftファイル
class ViewController: UIViewController, CLLocationManagerDelegate {
  ......
}

viewDidLoadメソッド

  • Objective-Cの場合
1
2
3
4
5
6
7
8
// ViewController.mファイル
- (void)viewDidLoad {
  [super viewDidLoad];

  if([self.lm respondToSelector:@selector(requestAlwaysAuthorization)]) {
      [self.lm requestAlwaysAuthorization];
  }
}
  • Swiftの場合
1
2
3
4
5
6
7
override func viewDidLoad() {
  super.viewDidLoad()

  if((self.lm?.respondToSelector("requestAlwaysAuthorization")) != nil) {
      self.lm?.requestAlwaysAuthorization()
  }
}

CLLocationManagerDelegateメソッド

  • Objective-Cの場合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// ViewController.mファイル
// 位置情報の許可設定
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
  if (status == kCLAuthorizationStatusNotDetermined) {
  } else if(status == kCLAuthorizationStatusAuthorizedAlways) {
      [self.lm startUpdatingLocation];
  } else if(status == kCLAuthorizationStatusAuthorizedWhenInUse) {
      [self.lm startUpdatingLocation];
  }
}

// 位置情報の更新ハンドリング処理
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
  CLLocation *currentLocation = locations.lastObject;
  CLLocationDegrees lat = currentLocation.coordinate.latitude;
  CLLocationDegrees lng = currentLocation.coordinate.longitude;
  CLLocationDegrees alt = currentLocation.altitude;
  CLLocationDirection course = currentLocation.course;
  CLLocationSpeed spd = currentLocation.speed;
  CLLocationAccuracy hacc = currentLocation.horizontalAccuracy;
  CLLocationAccuracy vacc = currentLocation.verticalAccuracy;
  NSDate *dt = currentLocation.timestamp;
}
  • Swiftの場合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ViewController.swiftファイル
// 位置情報の許可設定
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
  if(status == .NotDetermined) {
  } else if(status == .Authorized) {
      self.lm?.startUpdatingLocation()
  } else if(status == .AuthorizedWhenInUse) {
      self.lm?.startUpdatingLocation()
  }
}

// 位置情報の更新ハンドリング処理
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
  var currentLocation:CLLocation? = locations.last as? CLLocation
  var lat:CLLocationDegrees? = currentLocation?.coordinate.latitude
  var lng:CLLocationDegrees? = currentLocation?.coordinate.longitude
  var alt:CLLocationDegrees? = currentLocation?.altitude
  var course:CLLocationDirection? = currentLocation?.course
  var spd:CLLocationSpeed? = currentLocation?.speed
  var hacc:CLLocationAccuracy? = currentLocation?.horizontalAccuracy
  var vacc:CLLocationAccuracy? = currentLocation?.verticalAccuracy
  var dt:NSDate! = currentLocation?.timestamp
}

これでコーディングは完了です。
Swiftでも位置情報が取得できるようになりました。
次回はSwiftで何を書こうかな。
といったところで本日はここまで。

Comments