如何在Swift中使用plist中的值而不将它们作为AnyObject出现?

时间:2014-10-23 11:17:53

标签: ios swift nsarray plist clcircleregion

我正在尝试从plist中获取对象并在Swift中使用它们来创建CLCircularRegion,但是当我尝试使用这些值时,我看到了这个错误

无法使用类型'的参数列表调用'init'(中心:$ T3,半径:@lvalue AnyObject?!,标识符:@lvalue AnyObject?!)'

这是我用来从plist中提取数据的方法,这可以正常工作,因为我可以通过println调用看到内容。

func setupLocations() {
// Region plist
let regionArray = NSArray(contentsOfFile: NSBundle.mainBundle().pathForResource("Landmarks", ofType: "plist")!)

println(regionArray)

for location in regionArray! {
    var longitudeNumber = location["Longitude"]
    var latitudeNumber = location["Latitude"]
    var rangeNumber = location["Range"]
    var regionString = location["Identifier"]

    let newRegion = CLCircularRegion(center: CLLocationCoordinate2DMake(latitudeNumber, longitudeNumber), radius: rangeNumber, identifier: regionString)
    }
}

在plist中,对象存储为一个包含字典的数组。该字典包含三个Number值和一个String值。

1 个答案:

答案 0 :(得分:0)

您从字典中提取的所有值都是选项和AnyObject类型。

首先要做的是对实际类型进行显式转换:

var longitudeNumber = location["Longitude"] as? Double
var latitudeNumber = location["Latitude"] as? Double
var rangeNumber = location["Range"] as? Int
var regionString = location["Identifier"] as? String

(我推断出基于变量名称的类型,但当然会更改为您期望的实际类型)。

接下来,你应该使用可选的绑定,但由于4嵌套if,或者更简单,这看起来很难看:

if longitudeNumber != nil && latitudeNumber != nil && rangeNumber != nil and regionString != nil {
    let newRegion = CLCircularRegion(center: CLLocationCoordinate2DMake(latitudeNumber!, longitudeNumber!), radius: rangeNumber!, identifier: regionString!)
}

请注意使用强制解包!,在这种情况下这是安全的,因为受到外部if语句的保护。