2016-11-24 5 views
0

これは私のコードです:私は機能updateStudentStudentオブジェクト、クラッシュMasterStudent結果へのキャストを渡すと迅速なダウンキャストの問題は、サブクラス化する

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 
    } 
} 

StudentオブジェクトをMasterStudentオブジェクトに変えたいと思います。あなたが唯一のダウンキャストstMasterStudentにすることができます

おかげ

+0

その行をカットしてください。このラインは無意味です(それだけでは何もしません)。どんな場合でもキャストする理由はありません。 – matt

+0

私はあなたの誤った基本的なOOPプログラミングを考える。 MasterStudentはStudentから継承しますので、強制的にダウンキャストするとクラッシュする可能性があります。単に学生からMasterStudentへのダウンキャストはいつでも可能です。 – dfd

答えて

2

私のために、であるように、コードはコンパイルされませんので、私はいくつかの小さな調整を行い、IBMスウィフトサンドボックスhereでスウィフト3にそれを更新:それ以外の場合は、新しいMasterStudentオブジェクトを作成する必要があります。

IはまたStudentをアップキャスト及びMasterStudentに次にダウンキャストでMasterStudentオブジェクトをインスタンス化するときにコードが失敗しないことを実証しているいくつかのサンプルコードを追加しました。ただし、Studentオブジェクトをインスタンス化すると、MasterStudentにダウンキャストされると失敗します。これは正しいタイプではありません。このように考えると、ちょっと単純化しています。Studentインスタンスには、MasterStudentの動作と一致するために必要なdegreeプロパティが欠落しています。

as!オペレータは、ダウンキャストが成功することが確実である場合にのみ使用してください。ここではその一例です。

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

as!演算子を使用して

は、コンパイラはあなたの判断を信頼して、コンパイル時エラーを提供することはありません。ダウンキャストが失敗した場合、ユーザーは実行時例外を受け取りますが、これは一般的に回避されます。 as?演算子は安全でない場合は、 nilを返します。

+0

最初のお返事ありがとうございます。あなたのサンドボックスに書き込んだものを見ました。更新機能を使用してStudentオブジェクトではなくMasterStudentオブジェクトを送信すると、Studentを送信してMasterStudentに変換する必要があります配列前の学生とすべての追加のフィールドとMasterStudentを追加する必要がありますありがとう – user7024226

+0

私は学生がMasterStudentに変換することはできませんあなたの前のコメントから理解した、フィールドスミスでもMasterStudentに学生を更新するには何が – user7024226

+0

ダウンキャストの代わりに新しいMasterStudentオブジェクトを作成する別のサンドボックススナップショット[ここ](http://swift.sandbox.bluemix.net/#/repl/5836feca27a1b233cd0fa980)を作成しました。 'degree'パラメータが渡されないと、MasterStudent初期化子のデフォルトのdegree値が" Masters "になりました。 –

1

それはstオブジェクトがすでにMasterStudentのインスタンスである場合。

MasterStudent(name: st.name, degree: "...")