PFQuery.getObjectWithId(objectId: String) --- 'AnyObject?' не конвертируется в ошибку 'String' --- Parse sdk 1.7.1 и Xcode 6.3

Я только что обновил Xcode до 6.3, а мой синтаксический анализ sdk до 1.7.1. Из документов Apple я знал, что собираюсь потратить некоторое время на исправление части своего быстрого кода в моем приложении для iOS. Xcode доволен всеми моими исправлениями, кроме одного, который получает класс разбора по id. Я исправил анализ, apple, stackru и google для исправления, но я часами бился об это последнее исправление и отчаянно нуждаюсь в помощи одного из вас, супер умных парней. Я заранее прошу прощения, если это окажется глупым вопросом. Я давно программирую, но я новичок в iOS.

Ниже приведен простой пример того, что я пытаюсь сделать, и это сработало до того, как я обновил Xcode и проанализировал SDK. Теперь XCode дает мне ошибки для каждой из строк, где я пытаюсь получить переменные из PFObject. Ошибки для каждой строки выглядят так: "AnyObject?" не может быть преобразовано в "String" и "Невозможно присвоить неизменное значение типа" String ". Любое понимание будет с благодарностью.

func getFakeObject(objectId: String) -> FakeObject {

    var fakeObject: FakeObject = FakeObject()
    var query = PFQuery(className:"FakeObject")
    var loadedFakeObject = query.getObjectWithId(objectId)
    if loadedFakeObject != nil {

            fakeObject.objectId = objectId
            fakeObject.isActive = loadedFakeObject["isActive"] as! Bool
            fakeObject.desc = loadedFakeObject["desc"] as! String
            fakeObject.purchasePrice = loadedFakeObject["purchasePrice"] as! Double
            fakeObject.purchaseDate = loadedFakeObject["purchaseDate"] as! NSDate
            fakeObject.labels = loadedFakeObject["labels"] as [String]

    }
    return fakeObject
}

1 ответ

Решение

Swift 1.2 намного строже в синтаксисе и пытается помешать вам неосознанно делать опасные вещи.

Где вы пишете:

var loadedFakeObject = query.getObjectWithId(objectId)
if loadedFakeObject != nil {

Попробуйте вместо этого:

if let loadedFakeObject = query.getObjectWithId(objectId) {

В первом случае вы получаете необязательный (такого объекта может не быть), а затем проверяете его nil, но затем все еще используя опционально. Поскольку это необязательно, вам нужно написать loadedFakeObject!["isActive"] as! Bool, Но на самом деле нет необходимости, потому что вместо этого вы можете использовать if let чтобы проверить и развернуть необязательный, то есть в пределах if Заявление, это больше не будет необязательным.

Вы также можете рассмотреть возможность перехода на as? вместо as! в разных местах, но это, вероятно, не причина вашей проблемы, а скорее безопасность во время выполнения.

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