为什么我在应用标签上的地标前加上“可选”一词?

时间:2015-11-17 01:50:52

标签: swift

编辑:完整代码现已发布,因为它已被请求。

为什么我在应用标签上的地标前加上“可选”一词?

我最初解开了这个\(p.thoroughfare!)这样的每个属性,并且它有效,但只有当 一个subThoroughfare时才有效。我无法解开\(subThoroughfare),因为我不知道该怎么做,因此当不是一个subThoroughfare时,应用程序就崩溃了。

enter image description here

    import UIKit
    import CoreLocation

    class ViewController: UIViewController, CLLocationManagerDelegate {

var manager:CLLocationManager!


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

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    manager = CLLocationManager()
    manager.delegate = self
    manager.desiredAccuracy - kCLLocationAccuracyBest
    manager.requestWhenInUseAuthorization()
    manager.startUpdatingLocation()


}

//NOTE: [AnyObject] changed to [CLLocation]

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

    print(locations)

    //userLocation - there is no need for casting, because we are now using CLLocation object

    var 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

        if (error != nil) {

            print(error)

        } else {

            if let p = placemarks?[0] {

                var subThoroughfare : String = ""

                if (p.subThoroughfare != nil) {

                    subThoroughfare = p.subThoroughfare!

                }

                self.addressLabel.text = "\(subThoroughfare) \(p.thoroughfare) \n \(p.subLocality) \n \(p.subAdministrativeArea) \n \(p.postalCode) \n \(p.country)"

            }


        }

    })

2 个答案:

答案 0 :(得分:2)

您正在获取Optional("string"),因为您没有展开这些可选的变量。

如果var str:String?nil并且您设置了myLabel.text = str,则您的标签文字将为空!如果它有一个值,我们说str = "yaw!"并设置myLabel.text = str,标签会显示yaw!

现在,如果您的字符串为nil并且您使用字符串插值myLabel.text = \(str),则标签文字将显示nil。如果您设置str = "yaw!"myLabel.text = \(str),则标签会显示Optional("yaw!")

要解决您的问题,您必须以安全的方式解开您的变种:

创建一个var来保存完整的字符串,然后将非零值添加到该字符串中。

    var fullString:String = ""
    if let _ = p.subThoroughfare { fullString += "\(p.subThoroughfare!)" } // Check if the attribute is not nil before adding it to the string

将第二行复制到每个属性p.thoroughfarep.subLocality

最后,设置self.addressLabel.text = fullString

答案 1 :(得分:0)

您将获得可选("某些")因为:

  1. 您的变量被定义为可选(意味着它可能是零)。
  2. 您正在使用Swift.print()来显示字符串。
  3. 如果它不是nil并且您没有使用Swift.print()来显示字符串,那么您将无法获得单词" Optional"和括号中的引号中的字符串值。

    在尝试访问数组中的值之前,您应该检查placemarks.count,即使您使用的数组索引为零(如示例代码中所示)。这应该是您的错误检查的一部分。

    至于其他人,我不确定你要做什么。如果您可以更具体,我可以提供一些建议。