memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

Develop in Swift 探求の生徒ファイルに含まれるplaygroundが動作しないときの対処方法

はじめに

1年次のゼミ科目で「プログラミングって楽しいなぁ」と思えるような体験ができたら、といろいろとやってきました。

昨年度は、p5jsというJavascriptでのお絵かきツールでした。

今年度は、他学部でSwiftプログラミングの認定資格制度をはじめたことを知りまして、うちの学科の学生さんも興味をもつかな?と思い、同じ教材で(Apple公式の教科書)を使って演習を進めていくことにしました。

https://www.apple.com/jp/education/docs/swift-club-xcode.pdf



 

ここから本題です

Xcode13でXcode12用のサンプルコードを動かしたらエラーが?

配属された1年生は8名でした。みなiPhoneユーザでしたが、Macは初めてのようで、基本的な操作を学びながら、教科書をダウンロードし準備を進めました。

この教科書にはプログラミングのサンプルファイルが付属してきます(教科書内にリンクがあり各自でダウンロードします)。このファイルを学生さんが動かしたところエラーが。。。

実は使用している教科書は1つ前のバージョン(Xcode12用)です。もともとこの教科書は英語で作成されていて、macOSがメジャーアップデートされると同時?に新しい版が出版されるようです。

現在、Xcode13なのですが、教科書はまだ英語版しかないため、日本語版のあるXcode12用を使用していました。サンプルファイルもXcode12用だったんですね。。。たった1つのバージョンなので後方互換性はあるだろうから大丈夫と思い、検証もしていませんでした。。。

エラーが出たファイルはSimulation.playground

教科書を読み始めると「Playground Basics.playground」をやり、「Naming and Identifiers.playground」をやります。ここまではエラーは出ませんでした。

エラーが出たのは以下のページでリンクされている「Simulation.playground」でした。



Xcode13とXcode12のSimulation.playgroundを比較しました

エラーメッセージは以下でした。_PageSources is not a leagal module Identifierとかいうエラーでした。このメッセージでググってみましたが同じような症状の報告は見つかりませんでした。なぜ? 古い記事ではTARGETを指定しないと。。。というものもありましたが、playgroundプロジェクトにはそもそもTARGETを指定するような設定画面がありませんでした。



もうこうなったらブルートフォース的に差を見つけていくしかないと思いました。Xcode13の教科書でダウンロードできるサンプルファイルはXcode13で問題なく動作しました。当たり前ですが。

そもそもpalygroundのファイル構造を知らなかったのですが、パッケージの中を見ていくとなんとなくわかってきました。途中の色々やったことは省略しますが、Swiftのプログラム自体はXcode12とXcode13でわずか1行だけでした。

Xcode13では「_ = createSimulation()」で、Xcode12では「createSimulation()」だけ。これを変えてもエラーは消えませんでした。つまりエラーの原因ではないということです。

その他のファイルの中身は同一でした。じゃ?何が違うんだろ?各ページのファイルの中身が英語か日本語かです。これはコンパイル自体には影響はないでしょう。

となると。。。わかりません。

もう一度、エラーメッセージを眺めてみました。「基本的なパラメータ」が「基本的なハ_ラメータ」になっています。なんで文字化けしているんだろ?と思いました。文字化けについては最初に見たときから気づいていたのですが、この変換も自動的になされて問題なくリンクされるものと想像していました。



もしかすると、ファイル名に日本語(マルチバイト文字)が入っているとビルドに失敗するんじゃね?と思ったわけです。試しに1ページだけ書き換えてみるとビンゴでした🎉

Xcode12用のサンプルファイルの修正方法

Xcode12用のplaygroundファイル(今回はSimulation.playground)を右クリックして「パッケージの内容を表示」を選択します。Pagesフォルダを開くと以下のような感じになっているはずです。



これを、以下のような感じに半角英数字で書き換えちゃいます。Xcode13用のサンプルファイルを見ながらオリジナルの英語ファイル名にしてもいいのですが、見比べるのは面倒なので、適当にローマ字でもいいのでどのファイルがどの名前かわかるように自分で勝手に名前をつけます。



で、さらに、上図の最上段にあるcontents.xcplaygroundというファイルをVSCode等で開いて編集して保存します。以下は編集後になります。



これでファイル名の要因によるエラーメッセージは表示されなくなり、シミュレーション画面がしっかり表示されるようになりました。

エラーが出たときは、Xcode13の英語版を使ってもらおうか?と思いましたが、やはり1年次にはちょっと大変そうです。Xcode13のplaygroundファイルを日本語化するか。。。とも思いましたが面倒そうでしたし、間違いがあったらハマりそうでした。

たぶん、このやり方が一番省力的な対処方法になると思います。

はい。

とりあえずこれで来週以降も進めてみたいと思います。

別解(追記)

playgroundファイルをXcodeで開いて、そこで編集するという手もあります。変更すると途中でビルドが走るせいかXcodeがたびたび落ちますが、最終的に日本語のページタイトルを半角英数字に変更すればエラーがでなくなり正常にシミュレーション画面が表示されるようになりました。



この方法であればエラーが出ないページのタイトルを修正する必要はありませんし、テキストエディタとかに慣れていない人でもできますし。こっちのほうがいいかもですね。ちなみになぜ?ページのタイトルに日本語が使えないのかわかりません。。。Xcode12まではできていたはずです。何か本質的な設定がXcode13では変わったのではないか。。。と想像しています。