Проблемы с проверкой наличия значения в Swift 2

Я пишу приложение для викторины, и есть табличное представление для добавления темы (имя сохраняется в основных данных), и когда вы выбираете путь индекса, он передает субъект в контроллер подробного представления (это прекрасно работает сам по себе) но у меня проблемы с проверкой, чтобы увидеть, существуют ли какие-либо карты (у субъекта есть NSOrderedSet "Cards"). Я продолжаю терпеть крах на двух моих попытках, я сделал это быстро с отношениями и tableViews, и это всегда было хорошо, поэтому я не уверен, в чем проблема здесь. Спасибо за помощь как всегда!

Моя первая попытка, хотя она говорит: "блок catch недоступен, потому что в блоке do нет ошибок", но после "do" в строке выдается "Bad Instruction"

    do {
        if let firstCard = self.subject?.cards![0] as? Card {
            self.currentCard = firstCard
        }
    } catch {


    }

Моя вторая попытка, вылетает на первой линии

    if let firstCard = self.subject?.cards![0] as? Card {
        self.currentCard = firstCard
    }

Моя третья попытка

    if self.subject!.cards != nil {

        self.currentCard = self.subject!.cards![0] as! Card
    }

Моя четвертая попытка, разворачивая как свойство субъекта, так и субъект, не вызывает самоконтроля, но все равно вылетает

    if let firstCard = self.subject!.cards?[0] as? Card {
        self.currentCard = firstCard
    }

Где объявлены свойства

var draggableView = DraggableView!()
var subject : Subject?
var currentCard : Card?
var cardArray = [Card]()

Обновление с методом subject (работает отлично, но поместите его здесь только для справки), тема передается из другого класса, и этот метод, вызываемый в верхней части представления, загружен.

func updateWithSubject(subject: Subject) {

    if let subject = self.subject {
        self.subject = subject
    }
}

2 ответа

Решение

Во всех четырех ваших попытках вы делаете "принудительное" развертывание (!) в какой-то момент, чего в целом следует избегать. Кроме того, вы пытаетесь получить доступ к индексу 0 в вашем NSOrderedSet; если набор пуст, доступ к [0] приведет к исключению времени выполнения.

Вместо этого вы можете использовать .array представление NSOrderedSet и использовать .first (необязательно) свойство массива для проверки безопасного доступа:

if let firstCard = self.subject?.cards?.array.first ...

Я думаю, что в твоей updateWithSubject метод. Вы проверяете, есть ли предмет, который уже инициализирован, прежде чем назначить его. Если это в вашем viewDidLoad и только там, назначение никогда не произойдет. Последующая принудительная распаковка, безусловно, потерпит неудачу после.

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