見出し画像

Xcode11.4の変更点 Swift5.2とシミュレータなど

開発に必須のツールがアップデートで使い勝手が変わってしまうのはストレスです。
【🔶2020年4月16日 Xcode 11.4.1 の情報を追加しました】
【Xcode 11.5は不具合対応が中心で新機能はリリースノートには載っていません。】
この記事では Xcode 11.4 で大きく変更になったSimulatorを中心にXcode 本体の変更点概要と使い方をレポートします。

電子書籍『Swift5初級ガイド』をAppleのブックストアから出しています。
サンプルは無料です。MacでもiPadでもiPhoneでも読めます。
WWDC2020で発表されたSwift 5.3に対応した第6版がダウンロード可能です。(ご購入済みの場合は無料アップデートです)
ブックストアから一度購入すると今後のアップデートは無料で読めます。

6宣伝store


Xcode11の変更点』(11.3の変更点まで含みます)もあわせてご覧ください。

・画像クリックで拡大表示できます

1 Xcode 11.4の概要

Xcode 11.4は11.3.1からのマイナーアップデートですが、シミュレータが大きく変わっています。

SDKはiOS 13.4, iPadOS 13.4, tvOS 13.4, watchOS 6.2, and macOS Catalina 10.15.4に対応です。

Xcode 11.3.1 はiOS13.3まででした。
最新OSにアップデートしたデバイスを接続しdebug作業をするには最新のXcodeが必要です。
【🔶Xcode 11.4.1のリリースノートでも対応SDKの表記は変わっていません。】
【🔶iOSのシミュレータはタイトルバーに13.4.1と表示します。】

Xcode 11.4を実行できるmacOSは10.15.2以降となりました。
Xcode 11.3.1までは10.14.4以降で実行できましたが、MojaveではXcode 11.4は起動できません。

Xcode 11.4からアプリのiOS、iPadOS、macOS、tvOSの各バージョンをユニバーサル購入として配信が可能になります。

Xcode 11.4はBeta3までシーディングがありました。
この記事はBeta3(11N132)を使いながら書きはじめ正式版(ビルド番号11E146)で確認しました。

画像12

【🔶2020年4月16日(日本時間)11.4.1(11E503a)がリリースされました。】
【🔶不具合対応が中心で新機能はリリースノートには載っていません。】


2 Swift 5.2対応

Xcode 11.3.1まではSwiftのバージョンは5.1でした。
Xcode 11.4のSwiftバージョンは5.2になりました。

Swiftのバージョンはコマンドラインで確認できます。
swift --version
Xcodeのパッケージ内のswiftコマンドを直接実行するにはswiftコマンドをターミナルにドラッグ&ドロップして --versionを入力しreturnで確認できます。
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift --version↩︎

このような結果が得られます:
Apple Swift version 5.2 (swiftlang-1103.0.32.1 clang-1103.0.32.29)
Target: x86_64-apple-darwin19.3.0

公式ドキュメント The Swift Programming Language によると3月24日付けの(Swift 5.1から5.2の主な)変更点は五つあります。
ただし五番目はドキュメントの明確化のための変更と思われます。

2月25日付けのswift.orgのドキュメントでは変更点は三つでした。
3月24日付けThe Swift Programming Language Document Revision Historyでは五項目になっていました。


❶ クロージャの代わりにキーパスを渡すことできるようになりました。

キー・パス式(Key-Path Expression)は、通常は関数またはクロージャを提供するコンテキストで使用できます。
具体的には、ルート型が SomeType で、パスが Value 型の値を生成するキー・パス式を、(SomeType) -> Value 型の関数またはクロージャの代わりに使用できます

❷特別な名前のメソッド(Methods with Special Names)
型のインスタンスを関数の書き方で呼び出すことを可能にします。

型にfunc callAsFunctionメソッドを宣言すると、そのメソッドを簡略した書き方で呼び出すことができます。(「callAsFunction」が特別な名前です)
この機能はクラス、struct、enumで利用可能です。

次のstructの例で説明します。
struct Adder {
  var base: Int
  func callAsFunction(_ x: Int) -> Int {
     return x + base
  }
}

struct Adderのイニシャライザでインスタンスを作り変数adderに代入します。

var adder = Adder(base: 3)

callAsFunction(_:)メソッドを実行するには

adder.callAsFunction(10)

と書きますが、Swift5.2からは次のように書くことができます。

adder(10)

(見慣れないと奇妙な印象を受けます)

❸ 添え字のデフォルト値
添字でデフォルト値を宣言できるようになりました。
デフォルト値の添字は省略時に使われます。

struct Subscriptable {
   subscript(x: Int, y: Int = 0) {
     // 詳細割愛
   }
}
let s = Subscriptable()
print(s[0])

s[0]でs[0, 0]にアクセスできます。

❹ Self型がより多くのコンテキストで使用できるようになりました。
クラス宣言のメンバーでは、「Self(型として大文字ではじまるSelf)」はメソッドの戻り型としてだけでなく
●読み取り専用の添字の戻り型として
●読み取り専用の計算されたプロパティのタイプとして
●メソッドの本体内
で使うことができるようになりました。

❺ Implicitly Unwrapped Optionalsセクションを更新して、Implicitly Unwrapped Optionalをオプション値または非オプション値として使用できることを明確にしました。
★この部分はSwift5.2とは直接関係ないようです。

2-1 Swiftの新機能(Xcodeリリースノートより)

クラス制約のあるプロトコル拡張では、拡張されたプロトコルがクラス制約を課さない場合、暗黙的に制約を推論するようになりました。

ベースクラスを定義しているモジュールの外で定義されたサブクラスのConvenienceイニシャライザの継承には、追加の制限があります。
これらのサブクラスがパブリックでない指定イニシャライザを持つベース・クラスを持っている場合、スーパークラスからConvenienceイニシャライザを自動的に継承することはできなくなりました。
この自動継承動作を復元するには、ベース・クラスはその指定されたイニシャライザがすべて公開またはオープンであることを確認しなければなりません。

Xcode とそれに対応するコマンドラインツールパッケージには、Swift と C ベースの言語のための SourceKit-LSP 言語サーバーが含まれています。
SourceKit-LSP は言語サーバープロトコル (LSP) をサポートするサードパーティ製のツールと一緒に使用することができ、コマンドラインから構築された Swift パッケージをサポートしています。
SourceKit-LSP の使用方法については、Getting Started with SourceKit-LSP を参照してください。

Swift コンパイラは、エラーメッセージの品質と精度を劇的に向上させる診断を生成するために新しい戦略を使用しています。
この新しい戦略の詳細については、SwiftブログのNew Diagnostic Architecture Overviewという記事を参照してください。

メソッドのオーバーライドは、ベースメソッドによって課せられていない要件を持つジェネリックなシグネチャを持つことができなくなります。


3 ユニバーサル購入

Xcode 11.4がユニバーサル購入のビルドと配布に対応していることはリリースノートの最初に書かれています。
2020年3月23日にDeveloper向けNews and Updatesで告知されました。

ユニバーサル購入についてもっと詳しく(英語)へのリンクがあります)

macOSアプリをユニバーサル購入として配布するには、新しいプロジェクトを作成するときにXcodeテンプレートアシスタントでiOSアプリと同じバンドル識別子を指定します。 既存のプロジェクトがある場合は、プロジェクトエディターでバンドル識別子を編集します。

ユニバーサル購入についてのアップルの開発者向け発表はこちらです。

このリンクからユニバーサル購入に関するApp Store Connectヘルプも確認してください。


4 プレイグラウンドでのSwiftUI対応改善

Xcode 11で利用可能になったSwiftUIはプレイグラウンドでも利用可能です。

しかしXcode 11.3.1のプレイグラウンドではいくつか問題もありました。
ライブビュー画面を再表示しない場合がある現象は解消したようです。

Xcode 11.3.1で問題のあったプレイグラウンドで確認したところ、そのままでは何も表示しませんでした。
プレイグラウンド書類を新規に作り直しコードをコピーして実行すると問題ありませんでした。
ForEachでたくさんログを出力する問題も解消されていました。

Xcode 11.4のプレイグラウンドではSwiftUIコードの実行時の問題がかなり改善されています。

Xcode 11でもSwiftUIのプレビューとインスペクターは、macOS Catalina(10.15)環境での実行が必要でした。
プレイグラウンドで実行すれば10.14.6などでもSwiftUIを試すことができました。

リリースノートによる既知の問題点

SwiftUIのビューは、クイックルックのプレビューやインラインの結果ビューではレンダリングされません。

Xcode 11.3.1では表示されていました。早めのアップデートに期待しましょう。

リリースノートによる解決済みの問題

インライン結果の下の線が不明瞭になることはなくなりました。
自動コード提案は、プロジェクト内に埋め込まれたPlaygroundに対してより信頼性があります。
単一行のdocコメントでは、次の行がドキュメントとしてレンダリングされる問題はなくなりました。
iOSのライブビューはデフォルトでシステムの背景色を使用するようになりました。
Playgroundのソースコードにおける課題アノテーションの信頼性を向上させました。


5 Simulatorの画面の変更点

シミュレータのバージョンも11.4です。
【🔶Xcode 11.4.1でシミュレータのバージョンも11.4.1になりました】

画像15

Xcode 11.4のシミュレータを起動してすぐに気が付くのはタイトルバーがついたことです。
【🔶Xcode 11.4.1でシミュレータのiOSバージョンが13.4.1になりました】

シミュレータ11.4.1

クローズとDocにしまうボタンは有効です。
タイトルには機種名とOSバージョンを表示します。
タイトル部分をクリックするとOSバージョン表示がビルド番号に変わります。

シミュレータ2

右側には「Save Screenshot」「Home」「Rotate Right」の各ボタンがあり、常に操作可能です。

Save Screenshotは実機と同じようにフレームは入らない四角形です。
スクリーンショットはシミュレータを実行しているMacのファイルとして、ファイル名「Simulator Screen Shot - iPhone 11 - 2020-03-25 at 13.10.54.png」などで保存します。

デバイスがiPadの場合はタイトルバーはボタンが二つふえます。

画像23

iPad専用のボタンは右からCapture CursorCapture Keyboardです。

Capture CursorをクリックするとiPadにトラックパッド/マウスを接続した状態をシミュレートします
メニューのI/O > Input > Send Cursor to Device と同じです。
詳しくは 7-3  Inputメニュー を参照してください。
オンにすると自動でCapture Keyboardもオンになります。
カーソルはiPadの画面内だけで動きます。(メニューも操作できません)
Capture Cursor状態から抜け出すにはescキーを押します。(キーは設定で変更可能です)

画像17

Capture KeyboardはメニューのI/O > Input > Send Keyboard Input to Deviceを選んだのと同じです。(タッチバーのボタンと同じです)
iPadにキーボードを接続し外部キーボードからの操作をシミュレートします。
効果は 7-3  Inputメニュー を参照してください。
Capture Keyboard状態から抜け出すにはescキーを押します。(キーは設定で変更可能です)


6 Simulator に追加された設定

11.3.1のシミュレータには設定がありませんでした。

11.4では設定画面があります。
メニューは通常のアプリと同じ Simulator > Preferences です。

画像2

Exit Capturing Shortcut:
Capture Cursor、Capture Keyboard状態から抜け出すためのキーを切り替えます。(メニューでは 「Send Cursor to Device」「 Send Keyboard Input to Device」です)
デフォルトはescキーです。
脱出が必要な場合はタイトルバーに「Press esc to exit」などと表示します。

Simulator lifetime: ☑️When app quits, leave simulator running
チェックすると、アプリを終了したときシミュレータを実行したままにします。

Simulator lifetime: ☑️When device window closes, leave simulator running
チェックすると、デバイスウインドウを閉じたときシミュレータを実行したままにします。

debug中の状態がそのまま残っているようです。たとえばView階層の表示なども可能です。
副作用が考えられます、通常の開発ではデフォルトのまま(チェックしない)をおすすめします。

Visual indicators: ☑️Show single tuches
チェックするとシミュレータをタッチ操作(Macでクリック)すると、タッチ中半透明グレイで塗りつぶした円を表示します。

Visual indicators: ☑️Show pinch gestures
optionキーを押すとマウスポインタ位置と仮想のタッチ位置にグレイで塗りつぶした円を表示します。
仮想のタッチ位置は画面の中央でマウスの点対象位置になります。
これまでのシミュレータでは表示がデフォルトでしたが、チェックを外すと非表示にできます。
optionキーを押しながらピンチイン・ピンチアウト・ローテイト操作が可能です。


ここから先は

5,675字 / 15画像

¥ 500

今後も記事を増やすつもりです。 サポートしていただけると大変はげみになります。