编辑:完整代码现已发布,因为它已被请求。
为什么我在应用标签上的地标前加上“可选”一词?
我最初解开了这个\(p.thoroughfare!)
这样的每个属性,并且它有效,但只有当 一个subThoroughfare时才有效。我无法解开\(subThoroughfare)
,因为我不知道该怎么做,因此当不是一个subThoroughfare时,应用程序就崩溃了。
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)"
}
}
})
答案 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.thoroughfare
,p.subLocality
等
最后,设置self.addressLabel.text = fullString
答案 1 :(得分:0)
您将获得可选("某些")因为:
如果它不是nil并且您没有使用Swift.print()来显示字符串,那么您将无法获得单词" Optional"和括号中的引号中的字符串值。
在尝试访问数组中的值之前,您应该检查placemarks.count,即使您使用的数组索引为零(如示例代码中所示)。这应该是您的错误检查的一部分。
至于其他人,我不确定你要做什么。如果您可以更具体,我可以提供一些建议。