2016-11-24 4 views
0

Это мой код:быстр опущенный вопрос от суперкласса к подклассу

class Student { 
    var name: String? 
    init (name: String) { 
     self.name = name 
    } 
} 

class MasterStudent: Student { 
    var degree: String? 
    init(name: String, degree: String) { 
     self.degree = degree 
     super.init(name: name, degree: degree) 
    } 
} 

fun updateStudent(stu: Student) { 
    var count = 0 
    for st in studentArray {    
     if (st.id == stu.id) { 
      studentArray.removeAtIndex(count) 
      st as! MasterStudent  //thread 1 signal :SIGABRT 
      studentArray.append(stu) 
     } 
     count += 1 
    } 
} 

Если я прохожу функцию updateStudentStudent объекта, приведение к MasterStudent результатам в аварии. Я хочу превратить объект Student в объект MasterStudent.

благодарит

+0

Просто нарежьте эту линию. Линия не имеет смысла (бросок сам по себе ничего не делает), и у вас нет причин бросать в любом случае. – matt

+0

Я думаю, что ваше неправильное использование базового программирования ООП. MasterStudent наследует от Student, поэтому ваш ** принудительный downcast ** МОЖЕТ привести к сбоям. Проще говоря, вы не можете ВСЕГДА преуменьшать от Студента до MasterStudent. – dfd

ответ

2

код не компилируется как есть для меня, так что я сделал некоторые небольшие изменения и обновлять его Swift 3 в IBM Swift песочнице here.

Я также добавил некоторый пример кода демонстрирует, что код не терпит неудачу, когда инстанцирование MasterStudent объекта, вентиляционные к Student, а затем опущенному к MasterStudent. Тем не менее, создание объекта Student приведет к сбою при его отключении до MasterStudent. Это не правильный тип. Подумайте об этом таким образом, и я упрощаю бит - в экземпляре Student отсутствует свойство degree, которое должно соответствовать поведению MasterStudent.

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

let obj:Any = "Hello World" 
let obj2 = obj as! String 

При использовании оператора as!, компилятор доверяя свое суждение и не даст ошибку времени компиляции. Если downcast не увенчался успехом, ваши пользователи получат исключение во время выполнения, чего обычно следует избегать. Оператор as? является более безопасным выбором, поскольку он будет либо подавлен, либо возвращен nil, если он не увенчался успехом.

+0

первое спасибо за быстрый ответ, я увидел, что вы написали в своей песочнице, и когда вы используете с функцией обновления, вы отправляете объект MasterStudent не объект Student, мне нужно отправить студента и преобразовать его в MasterStudent, поэтому я удаляю его из массив предыдущего ученика и нужно добавить MasterStudent со всеми дополнительными полями, спасибо снова – user7024226

+0

Я понял из вашего собеседника, что Студент не может преобразовать в MasterStudent, что я могу сделать, чтобы обновить Student до MasterStudent, даже если степень поля отсутствует, – user7024226

+0

Я создал еще один снимок Sandbox [здесь] (http://swift.sandbox.bluemix.net/#/repl/5836feca27a1b233cd0fa980), который создает новый объект MasterStudent вместо downcasting. Обратите внимание, что инициализатор MasterStudent теперь имеет значение степени по умолчанию «Masters», если параметр 'degree' не передан. –

1

Вы можете только подавленным st к MasterStudent, если его st объект уже является экземпляром MasterStudent. В противном случае вам нужно будет создать новый объект MasterStudent:

MasterStudent(name: st.name, degree: "...") 
Смежные вопросы