このページは「はじめてのSwiftプログラミング」(清水美樹著、工学社刊、2014年8月23日発売、ISBN978-4-7775-1851-7)の著者によるサポートページです
本書第8章で実践した「列挙体」で、メソッドtoRawとfromRawがなくなっています。
代わりに、以下のように書きます。
プロパティなので、カッコをつけません。本書では、リスト8-2-3などが該当します。
リスト8-2-3Size2.Large.toRaw() > Size2.Small.toRaw()
Size2.Large.rawValue > Size2.Small.rawValue本書中の他のサンプルコードも同様に修正してみてください。
「プロパティrawValueに値を渡して、新しい列挙体メンバーのインスタンスを生成する」という形になっています。
リスト8-2-6if let newSize = Size2.fromRaw(++sizenow)
if let newSize = Size2(rawValue:++sizenow)
Swiftでは、「すべてのオブジェクトを包括するデータ型」として、「Any」を使用することになりました。
これまで使用できた「AnyObject」はコンパイルエラー、または実行エラーを引き起こします。
var myValue:AnyObject = 4.2
var myValue:Any = 4.2
第4-2節において「AnyObject(以後はAny)」で値を定義すれば、
小数のように書かれた値を整数にダウンキャストできる例を示しましたが、これができなくなりました。
ただし、小数のように書かれた「Any」型の値を、小数にダウンキャストすることはできます。
第5-2節においてディクショナリの「値」がいろいろなデータ型をとる例を示しましたが、 これにはあらかじめデータ型を「キーは文字列、値はAny」のように指定する必要がでてきました。
var john: Dictionary<String, Any> john = ["name": "ジョニー", "age": 18, "height": 175.2, "married":false]これで、リスト5-2-4以下を続けられます。
本書の以下のサンプルをiOSプログラムとして実行する場合は以下の注意が必要です。
このプログラムでは、「関数が関数を呼び出す」構造をとっています。基本的にはこの構造は全然問題ないのですが、iOSプログラムに載せる場合、「関数」をさらにメソッド「ViewDidLoad」に入れる必要があります。
メソッドの中に入ると関数は「ローカル関数」となります。そして、「ローカル関数」は互いに参照し合えないという規則が、この時点でできました(また変わるかも知れませんが)
回避法は以下の通りです。
4つの関数のうち、最終的に結果を出す関数「bSearch」以外の3つについて、その定義を、メソッド「viewDidLoad」の外に出します。
ただし、3つの関数はいずれもストラクチャ「Book」を参照しますので、ストラクチャBookの定義も3つの関数と同じ位置に移動します。
上記と同じ考えです。結果を与える関数「reportHeightSize」が参照する関数「yourSize」のほうを、メソッド「viewDidLoad」の外に出します。
このプログラムは、「Playground」中であれば問題なく動きますが、iOSプログラムとして書くと、コンパイルエラーは出ませんが実行エラーになります。
本書リスト9-6-4にある、図2の部分で「BAD_ACCESS」というエラーが出て止まります。これは、「メモリ・エラー」です。
これは、Swiftのバグと考えられています。
しかし回避法があります。プロトコル「App」と「MyDelegate」の二つの定義に「@objc」の修飾子をつけてください。これは、「SwiftではなくObjective-Cのオブジェクトである」という注釈です。
これで実行されます。
でも、こんなことをしなければならないのならSwiftを書く意義がかなり減りますから、やはりバグでしょう。次のアップデートでどうなるか、また報告します。