Подтвердить что ты не робот

Получить из AnyObject (NSString) в 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?

4b9b3361

Ответ 1

Я закончил с уродливой строкой:

var uuidString:String = regionToMonitor["uuid"] as! String

никаких предупреждений, ошибок, ошибок времени выполнения

Ответ 2

Я нашел, что это работает для меня

var uuidString: String? = regionToMonitor["uuid"] as AnyObject? as? String

EDIT: это был ответ для более старой версии

Пожалуйста, используйте принятый ответ.

Ответ 3

AnyObject? является необязательным, поскольку словарь может содержать или не содержать значение для ключа "uuid". Чтобы получить дополнительное значение, вам необходимо развернуть его. См. Опции в документации.

Самый безопасный способ справиться с необязательным - это поставить его в условный оператор.

if let uuidString = regionToMonitor["uuid"] {
    // do something with uuidString
}

Если вы абсолютно уверены, что словарь всегда будет содержать эту пару ключ/значение, вы можете использовать неявно развернутый необязательный (суффикс !):

println("UUID: \(regionToMonitor["uuid"]!)")       

В этом случае, если нет значения для ключа, которое ваше приложение выйдет из строя.

Если вы много используете !, похоже, что вы все время кричите..., что может помочь проиллюстрировать, почему вы должны использовать его экономно, если вообще.:)

Ответ 4

Я нашел рабочее решение, которое компилируется без предупреждений и т.д.

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. Хотя, они должны быть взаимозаменяемыми, но, возможно, они не такие, как мы.

Ответ 5

Я не уверен, что мое решение неэффективно, но вот оно.

var uuidVar = regionToMonitor["uuid"]
var uuidString:String = "\(uuidVar)"

Надеюсь, что это поможет.

Ответ 6

Вы также можете использовать

var uuidString = regionToMonitor["uuid"]? as String

Он имеет те же результаты, что и вы, но IMHO более ясен в намерениях. Сила оператора as разворачивается в любом случае, поэтому поместив восклицательный знак, он становится лишним. Помещая знак вопроса за индекс словаря, ясно, что вы привязываете необязательный.

Ответ 7

Если вы уверены, что хотите развернутое значение, вы можете использовать любой из них:

var uuidString:String! = regionToMonitor["uuid"]
var uuidString = regionToMonitor["uuid"] as String!

или даже это:

if var uuidString = regionToMonitor["uuid"] {
    println("\(uuidString) has been unwrapped")
}

Ответ 8

Держите его простым:

let uuidString = "\(regionToMonitor["uuid"])"