Как я могу использовать значения из списка в Swift без их появления в качестве AnyObject?

Я пытаюсь извлечь объекты из списка и использовать их в Swift для создания CLCircularRegion, но когда я пытаюсь использовать эти значения, я вижу эту ошибку

Невозможно вызвать 'init' со списком аргументов типа '(центр: $T3, radius: @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)
    }
}

В списке свойств объекты хранятся в виде массива, который содержит словарь. Этот словарь содержит три числовых значения и одно строковое значение.

1 ответ

Решение

Все значения, которые вы извлекаете из словаря, являются необязательными и 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 заявление.

Другие вопросы по тегам