aejhyun
aejhyun

Reputation: 612

Optional() in my text view

For one of my static labels on my main story board, it prints out "Optional("United States"). However, I would like it to print out "United States". So my question is, how do I get rid of the "Optional" part? I've already tried doing:

if let p = placemarks!.first{
      self.addressLabel.text = "\(p.country)"
}

I think the exclamation mark is supposed to "unwrap" some value right? However, even if I do p = placemarks!.first, it prints out "Optional("United States").

Below is the rest of my code just in case you would like some context:

//
//  ViewController.swift
//  Map Demo Rob 2
//
//  Created by Jae Hyun Kim on 8/17/15.
//  Copyright © 2015 Jae Hyun Kim. All rights reserved.
//

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var latitudeLabel: UILabel!
    @IBOutlet weak var longitudeLabel: UILabel!
    @IBOutlet weak var courseLabel: UILabel!
    @IBOutlet weak var speedLabel: UILabel!
    @IBOutlet weak var altitudeLabel: UILabel!
    @IBOutlet weak var addressLabel: UILabel!
    var manager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()
        manager = CLLocationManager()
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.requestWhenInUseAuthorization()
        manager.startUpdatingLocation()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        print(locations)

        let userLocation: CLLocation = locations[0]
        self.latitudeLabel.text = "\(userLocation.coordinate.latitude)"
        self.longitudeLabel.text = "\(userLocation.coordinate.longitude)"
        self.courseLabel.text = "\(userLocation.course)"
        self.speedLabel.text = "\(userLocation.speed)"
        self.altitudeLabel.text = "\(userLocation.altitude)"

        CLGeocoder().reverseGeocodeLocation(userLocation, completionHandler: {(placemarks, error) -> Void in
            print(userLocation)

            if error != nil {
                print(error)
                return
            }
            else {
                if let p = placemarks?.first{
                    self.addressLabel.text = "\(p.country)"
                }
            }
        })




    }

}

Upvotes: 0

Views: 802

Answers (1)

David Skrundz
David Skrundz

Reputation: 13347

In

if let p = placemarks!.first{
    self.addressLabel.text = "\(p.country)"
}

p.country is an Optional<String>. You need to unwrap that aswell in order to output only it's content (if it exists).

if let country = placemarks?.first?.country {
    self.addressLabel.text = country
}

Upvotes: 1

Related Questions