我试图从plist中获取对象,并在Swift中使用它们来创建CLCircularRegion,但当我尝试使用这些值时,我看到了这个错误
无法使用类型的参数列表调用"init"(中心:$T3,半径:@lvalue AnyObject?!,标识符:@lvvalue 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中,对象存储为一个数组,其中包含一个字典。那个字典包含三个数字值和一个字符串值。
从字典中提取的所有值都是可选值,并且都是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
语句的保护。