2016-01-20 6 views
0

Я пишу приложение для викторины и есть табличное представление, чтобы добавить тему (имя сохраняется в основных данных), и когда вы выбираете путь индекса, который он передает, при условии, что контроллер подробного представления (это работает просто отлично), но у меня возникают проблемы с проверкой того, существуют ли какие-либо карты (у субъекта есть NSOrderedSet из «Карт»). Я продолжаю сталкиваться с двумя моими попытками: я делал это быстро, с отношениями и таблицами, и это всегда было хорошо, поэтому я не уверен, в чем проблема. Спасибо за помощь, как всегда!Проблемы с проверкой, существует ли значение в Swift 2

Моя первая попытка, хотя он говорит, «поймать блок недоступен, поскольку никаких ошибок не выбрасывается в сделать блок», он выходит из строя с «Bad Инструкцией» на линии после того, как «сделать»

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 
    } 

Моя четвёртая попытка, разворачивая как субъекта собственности и субъекта, он не звонит из self.subject.cards, но по-прежнему падает

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

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

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

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

func updateWithSubject(subject: Subject) { 

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

Во всех четырех ваших попыток, вы «принудительные» ('!') в какой-то момент, чего обычно следует избегать. Кроме того, вместо того, чтобы явно пытаться получить доступ к индексу '0' в вашем массиве, вместо этого вы можете использовать свойство' .first' (необязательно). Если ваш массив пуст, доступ к '[0]' приведет к исключению во время выполнения. Вы можете попробовать 'if let firstCard = self.subject? .cards? .first ...'. (Кроме того, свойство '.cards' класса' Subject'/struct не является объектом 'Card'? Интересно о преобразовании типа в' Card'.) – dfri

+0

В нем указано, что NSOrderedSet не имеет члена «первым», что бы лучший способ преобразования множества в массив? – Echizzle

+1

Мой плохой, я думал, что свойство '.cards'' Subject' было массивом объектов 'Card' (вы не показали нам' Subject' class/struct ... Но теперь я вижу, что вы написали это в текст). В любом случае, 'NSOrderedSet' имеет свойство' .array', _ "Представление упорядоченного набора как массива. (Только для чтения)" _, поэтому, я думаю, вы могли бы использовать 'if let firstCard = self.subject? .cards ? .array.first ... '. – dfri

ответ

1

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

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

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

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

+0

возможно, но когда я сделал печать (self.subject.name) в том же методе он работал – Echizzle

+0

Можем ли мы увидеть больше вашего 'viewDidLoad'? Мне интересно, как это называется с классом, передающим его. – mango