Ответ 1
Я закончил с уродливой строкой:
var uuidString:String = regionToMonitor["uuid"] as! String
никаких предупреждений, ошибок, ошибок времени выполнения
Я читаю ключ plist (NSArray с n NSdictionaries):
let regionsToMonitor = NSBundle.mainBundle().infoDictionary["Regions"] as Array<Dictionary<String,AnyObject>>
теперь я перебираю его:
for regionToMonitor in regionsToMonitor {
и теперь я хочу получить uuidString областиToMonitor
в ObjC: NSString *uuidString = regionToMonitor[@"uuidString"];
в быстрой попытке: let uuidString = regionToMonitor["uuid"]!.stringValue;
выше компилируется, но строка всегда nil
в swift. regionToMonitor["uuid"]
при использовании без!.stringValue отлично работает в println
как мне получить действительный Swift.String здесь?
Я пытаюсь передать его NSUUID!
Я также пробовал
let uuidString:String = regionToMonitor["uuid"]
= > AnyObject не конвертируется в String
let uuidString = regionToMonitor["uuid"] as String
= > Не удалось найти перегрузку для "индекса", который принимает предоставленные аргументы
let uuidString = regionToMonitor["uuid"];
= > 'AnyObject?' не может быть явно опущен к "String"; вы хотели использовать "как", чтобы заставить downcast?
Я закончил с уродливой строкой:
var uuidString:String = regionToMonitor["uuid"] as! String
никаких предупреждений, ошибок, ошибок времени выполнения
Я нашел, что это работает для меня
var uuidString: String? = regionToMonitor["uuid"] as AnyObject? as? String
EDIT: это был ответ для более старой версии
Пожалуйста, используйте принятый ответ.
AnyObject?
является необязательным, поскольку словарь может содержать или не содержать значение для ключа "uuid". Чтобы получить дополнительное значение, вам необходимо развернуть его. См. Опции в документации.
Самый безопасный способ справиться с необязательным - это поставить его в условный оператор.
if let uuidString = regionToMonitor["uuid"] {
// do something with uuidString
}
Если вы абсолютно уверены, что словарь всегда будет содержать эту пару ключ/значение, вы можете использовать неявно развернутый необязательный (суффикс !
):
println("UUID: \(regionToMonitor["uuid"]!)")
В этом случае, если нет значения для ключа, которое ваше приложение выйдет из строя.
Если вы много используете !
, похоже, что вы все время кричите..., что может помочь проиллюстрировать, почему вы должны использовать его экономно, если вообще.:)
Я нашел рабочее решение, которое компилируется без предупреждений и т.д.
var regions = NSBundle.mainBundle().infoDictionary["Regions"] as Array<Dictionary<String, AnyObject>>
for region in regions {
let dict: NSDictionary = region
var uuid = dict["uuidString"] as String
}
infoDictionary
из NSBundle
возвращает NSArray
и NSDictionary
, а не Swift.Array
или Swift.Dictionary
. Хотя, они должны быть взаимозаменяемыми, но, возможно, они не такие, как мы.
Я не уверен, что мое решение неэффективно, но вот оно.
var uuidVar = regionToMonitor["uuid"]
var uuidString:String = "\(uuidVar)"
Надеюсь, что это поможет.
Вы также можете использовать
var uuidString = regionToMonitor["uuid"]? as String
Он имеет те же результаты, что и вы, но IMHO более ясен в намерениях. Сила оператора as
разворачивается в любом случае, поэтому поместив восклицательный знак, он становится лишним. Помещая знак вопроса за индекс словаря, ясно, что вы привязываете необязательный.
Если вы уверены, что хотите развернутое значение, вы можете использовать любой из них:
var uuidString:String! = regionToMonitor["uuid"]
var uuidString = regionToMonitor["uuid"] as String!
или даже это:
if var uuidString = regionToMonitor["uuid"] {
println("\(uuidString) has been unwrapped")
}
Держите его простым:
let uuidString = "\(regionToMonitor["uuid"])"