Swiftでテトリス(Swiftris)を作るとき発生したエラーのまとめ。


「The Swift Programming Languageを読む」という苦行を終えて、、、
次はなにしようかなーと思ってたら、テトリスの作り方見つけた!
Swiftで作ったTetrisということで、Swiftrisというみたい。
スゲー!面白そう!やってみよう!といことで、そのメモ。

作るもの

↓これ。
swiftris

使用ツールのバージョン

Xcode6.1ベータ版、Swift1.1(たぶん)

教材

Swiftris: Build Your First iOS Game with Swift

例によって例のごとく、教材をなぞって進めていくだけなのです。
が、ツールのバージョン違いのせいでいくつかエラーが出たところがあるので、
書いておきます。

注意点:私はこんなエラーがでました。

.toRaw()と.fromRaw()の記述

Swift1.1では、.toRaw()と.fromRaw()は、書き方が変わったとのこと。
dankogai氏の記事に助けられました。

enum の.fromRaw(value)もYourEnum(rawValue:value)に

RawRepresentableプロトコルに従った(つまりで型を継承している)enumはにはもれなく.fromRaw(val)メソッドがついてきたのですが、これもYourEnum(rawValue:val)という書き方に変わりました。

加えて.toRaw()メソッドもrawValueプロパティに置き換えられています

enum Foo: Int { case A = 0, B = 1, C = 2 }
let foo = Foo(rawValue: 2)! // 以前は ‘Foo.fromRaw(2)!’
println(foo.rawValue) // 以前は ‘foo.toRaw()’!

Swiftrisでは、何回か、.toRaw()や.fromRaw()の記述がでてくるので、
上記の書き方にかえてみてください。

Thread 1 signal SIGABRT

チュートリアル通りにコードを書き終えて、いざビルドすると、エラーが出まして、これにドハまりしました。コードエラーはでないのに、ビルドするとエラーがでる。。。

↓エラーメッセージ
Thread 1 signal SIGABRT
Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘A Node can’t parent itself

対処法としては、
~~~~.addchildもしくはaddchildと記述があるところを、すべて、
self.addchildに書き換えました。

例えば、

addChild(background)は、self.addChild(background)に、
shapeLayer.addChild(gameBoard)は、self.addChild(gameBoard)に、

といった具合です。

原因は、「NODEはそれ自身が親にはなれない」とのこと。
なんかThe Swift Programming Languageで見たことあるような気がする、
と思って、色々トライしてみたら解決!
いやー、読んでて良かった、ホント。

なお、Thread 1 signal SIGABRTというエラーは初心者の登竜門らしく、
多分に漏れず私も引っかかってしまいました。
このエラーについては、ググるとたくさん記事がでてきますが、
Thread 1:signal SIGABRT って何?の記事リストが参考になりました。

出来上がってみて

感動した!!!!!swiftたのしい!!!!!
次は、教材を使わずに、自分の力でアプリを作ってみよう!


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です