Swift Online（Swift以外 Onlineも含む）

# はじめに

[**Swift**](https://docs.swift.org/swift-book/)のシンタックスをちょっと確認したいとか、このコードが期待通りに動くのかを試したいとか、自分はそういう時に、その都度Macを起動しXcodeを立ち上げるのも面倒なため、iPadからオンラインでSwiftをコーディング&実行することがあります。

_ここでいう**オンライン**とは、ウェブブラウザ上でSwiftのコンパイル・実行ができる環境のことを指します。_

そういったオンラインサービスを提供しているサイトをググったところ、**無料**、かつ、アカウント**登録不要**で利用できるサイトを**8**つ見つけたので、各サイトの概要と特徴をまとめておきます。

_Swiftの**バージョン**は今後新しくなっていく可能性があります。ここに記載したバージョンは執筆時点(2020.4.22)のものです_

# 確認ポイント

各サイトについて、次の**4**項目を共通的な確認ポイントとしました。

1. Swift専用か多言語対応か
2. Swiftのバージョンを選択できるか固定か
3. 標準入力をサポートしているか
4. コード補完機能があるか


## 1. Swift専用か多言語対応か

サイトを分類すると、Swift言語専用のサイトと、Swift含む多数の言語をサポートしているサイトに大別できます。

**8**サイトのうち、Swift専用は**3**サイト、残りは複数の言語をサポートしています。

## 2. Swiftのバージョンを選択できるか固定か

次にSwiftの**バージョン**を選択できるサイトか、特定の固定バージョンかを確認しました。

**8**サイトのうち、バージョンを選択できるのは**3**サイト、バージョン**不明**が**1**サイト、残りは特定バージョンのみでした。

## 3. 標準入力をサポートしているか

次に標準入力ができるかどうかを確認しました。標準入力ができない場合は`readLine`が`nil`を返すため強制アンラップのコードは落ちます。

**8**サイトのうち、標準入力を受け付けたのが**5**サイト（その内、インタラクティブが**3**サイト）、残りは標準入力を指定するところが見当たりませんでした。


## 4. コード補完機能があるか

最後にソースコード入力時のコード補完機能があるかないかを確認しました。コード補完があると、コード入力時に省力化になります。

**8**サイトのうち、コード補完機能があったのが**5**サイト、残りはありません。


# 8サイトの概要

前述の確認ポイントを一覧にまとめます。（順不同）

| # | サイト | Swift専用 | サポート バージョン | 標準入力 | コード補完機能 | その他特徴 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 1  |[paiza.io](#1-paizaio) | × | 5.1.2 | ○ | ○ | 有名サイト  |
| 2  |[Swift Playground](#2-swift-playground) | ○ | 3.0.1 〜 5.2 | × | ○ | バージョン多彩 |
| 3  |[repl.it](#3-replit) | × | 5.0.1 | ○ | ○ |標準入力がインタラクティブ|
| 4  |[codingground](#4-codingground) | × | 4.0 | ○ | × |サポート言語が豊富 |
| 5  |[SwiftWasm](#5-swiftwasm) | ○ | 不明 | × | × | デモサイト？  |
| 6  |[GDB Online](#6-gdb-online) | × | [2.1](http://question.onlinegdb.com/2406/what-version-of-swift?show=2406#q2406)？ | ○ | ○ | Online IDEだがSwiftのデバッガは未サポート |
| 7  |[JDoodle](#7-jdoodle) | × | 2.2 〜 5.1 | ○ | × | サポート言語が豊富 |
| 8  |[Online Swift Playground](#8-online-swift-playground)  | ○ | 5.0 , 5.1  | × | ○ | httpsでない  |

以降、個別に特徴をまとめます。

## 1. [paiza.io](https://paiza.io/ja) 

ネットで「swift online」をググると真っ先に出てくるサイトで、多数のサイトにて紹介されています。会社案内には「_paiza（パイザ）は、コードを書いて書類選考なしで面接・カジュアル面談に進める、全く新しいカタチのコーディング転職サービスです。_」と謳われてます。（_アルバイでもいいのかな？（余談です））_
![IMG_0014.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/5469b258-1041-2260-a08b-909ed4b1842c.png)
「コードを作成してみる（無料）」のバナーをクリックすると、コーディング画面に遷移します。画面左上にある言語選択のボタンで**Swift**を選びます。Swift以外にも多数の言語をサポートしています。
![IMG_0015.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ba88b4e7-2828-0e92-ce04-54cde57a4f60.png)
上側の黒いところにコードを書いて、その下の**実行**ボタンを押すとコンパイル&実行します。@koherさんの[FizzBuzz](https://qiita.com/koher/items/74b71242a1ca3b87abcf)を実行させた結果の画面です。
![IMG_0016.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/cb41bde5-29dd-8b7a-4d80-535ef54aaa45.png)
実行ボタンの下にある**入力**タブを押すと、標準入力のデータを入力するエリアに切り替わります。
![IMG_0017.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ca7ae9a9-12ac-4fc8-f6fc-128b39f384b3.png)
ちゃんと`readLine`が機能しています。
![IMG_0018.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/d50bd83e-e1b0-2d86-ae0e-1edc67409a80.png)


## 2. [Swift Playground](https://swift-playground.kishikawakatsumi.com)

[キシカワカツミ](https://kishikawakatsumi.com)さんの個人サイトのようです。サポートバージョンが細かく、10.2インチiPadの縦モードでもプルダウンがすべて表示しきれません。
![IMG_0019.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/d929e6da-35f2-2d0d-0cc9-2f7dd35489c6.png)
既出のFizzBuzzコードを実行させた結果です。
![IMG_0020.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/7f163ad1-7561-9a96-ffab-38800926eb82.png)
標準入力を指定することろは見当たらず、試しに`readLine`を**強制アンラップ**すると予想どおり落ちました。
![IMG_0021.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/87d93a43-56d3-538a-3880-ce66aae7711c.png)
サポートするバージョンが豊富なので、バージョン違いによるシンタックスや動きの違いを確認するには助かるサイトだと思います。また、執筆時点で最新バージョンである**5.2**をサポートしているのは当サイトだけでした。


## 3. [repl.it](https://repl.it/languages) 

イタリアのドメイン名でしょうか？ 上記リンクから遷移した画面です。このサイトは数多くの言語をサポートしています。下記スクショはその一部です。
![IMG_0023.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/0e63279d-e0c7-8e7d-a034-069b00b716b4.png)
Swiftのリンクをクリックすると下の画面に遷移します。コードを書いて**run**▶︎で実行します。既出のFizzBuzzコードを実行させた結果です。ソースコードのインデントに対応する縦線が入り見やすいです。
![IMG_0024.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/16d9a39e-54b4-8107-b4cb-a86f6c51e063.png)
右側の黒い部分がコンソールをリダイレクトしているようで、コンパイルと実行の**コマンドライン**がそのまま見えます。また標準入力もインタラクティブにリダイレクトしているようで、`print`を出力した後プログラムが止まり、適当に文字をタイプしてEnterキーで再開しました。
![IMG_0025.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/f5790b17-71a8-47e9-204f-05207c277df4.png)
画面右側にソースファイルを管理するペインが見えるので、複数のファイルに分かれているような大きい規模のプロジェクトも実行できるのかも知れません（未確認）。


## 4. [codingground](https://www.tutorialspoint.com/codingground.htm)

このサイトで驚いたのはサポート言語の豊富さです（75？）。今回紹介したサイトで一番かも。
![IMG_0026.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/a78efd73-be6b-e241-6ef3-622dcd482c1b.png)
縦長のトップページに、それはもう沢山の言語がアイコンと共に並んでいます。下はその一部です。BrainfuckやWhitespaceといったマニアックな言語まであります。
![IMG_0027.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/cb830d78-285d-74cc-b0b2-9493abf0dfd7.png)
Swiftをクリックすると下記の画面に遷移します。左上の**Excute**を押すとコンパイル&実行します。既出のFizzBuzzコードを実行させた結果です。
![IMG_0028.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/705a3efe-98f6-2efc-69e1-825e8c30462c.png)
**Excute**の並びの**STDIN**タブを押すと標準入力のデータを入れる画面に切り替わります。Swiftのバージョンが4.0と今やちょっと古い感じですが、レア言語を触ってみるには面白いサイトかも知れません。しかし、Whitespaceは動きませんでした。環境の問題と思われます。残念。
![IMG_0029.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/54368141-92de-6058-1ee1-114f1e9431db.png)


## 5. [SwiftWasm](https://swiftwasm.org)

「**ブラウザでSwiftを実行する**」という大きなバナーの通りですが、ページの後方には「_Swiftの多くの機能はまだWebAssemblyで動作していません_」の記載もあるので、開発中ソリューションの**お試し**サイトかも知れません。
![IMG_0030.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/b3da63ac-2358-2670-40f3-71821a24dbaf.png)
当サイトのサンプルコードがFizzBuzzとフィボナッチだったので、FizzBuzzのみ実行させた画面です。**Run**でコンパイル&実行します。
![IMG_0032.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ed80cbfd-7c57-38f1-34c0-b64dcde40267.png)
元々のサンプルコードの下の方に、SwiftでブラウザのJavascriptを実行させるコードが書いてあって、実際に動かすとブラウザのalretダイアログが出てきました。
![IMG_0033.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ad5c4d84-1987-0512-a565-28a43cf755d1.png)


## 6. [GDB Online](https://www.onlinegdb.com)

[About](https://www.onlinegdb.com/about)ページに『_C/C++言語用のオンラインコンパイラおよびデバッガツールです。組み込みgdbデバッガーを備えたデバッグ機能を提供する世界初のオンラインIDEです_』と謳っていて、画面構成もPC想定と思われ、10.2インチiPadでは入りきりません。言語もメジャーなところはサポートしているようです。
![IMG_0034.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/2585f72d-6a86-7dd1-c53e-27ba5080b67c.png)
右上の**Language**でSwiftを選んで、既出のFizzBuzzコードを実行させた結果です。
![IMG_0035.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/70700115-535c-32fc-deeb-91cb8624eecf.png)
画面右側のペインにIDEらしく変数とか監視できるような感じですが、残念ながらSwiftの**Debug**は未対応でした。
![IMG_0036.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/473c71b0-7dc0-c5e6-48d4-606ea5284a56.png)
今後サポートされると非MacユーザもSwiftがもっと身近になるかも知れません。
標準入力は、インタラクティブとテキスト(事前入力)の両方をサポートしていて、画面の中央付近にあるラジオボタンで切り替えます。
![IMG_0038.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/912b0f9b-e958-75d2-af69-a33ac119052b.png)
インタラクティブ指定時の実行結果です。
![IMG_0037.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6c6d2bc7-da11-6130-0fe7-1e25bf946396.png)
上の画面では見えてませんが、stdout、stderrの出力エリアもあって、C/C++開発者だと重宝するかも知れません。
[**FAQ**](https://www.onlinegdb.com/faq)ページに「ソースコードやstdin等のMAXサイズ、コンパイル・実行時の最大時間、メモリの上限」などの制限が記載されているしっかりしたサイトですが、Swiftのバージョンが古いのが残念です。


## 7. [JDoodle](https://www.jdoodle.com)

トップページに『72言語、2DB』と謳っていて、このサイトもサポート言語が豊富です。Whitespaceもあって、こちらのサイトはちゃんと動作しました。
![IMG_0039.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/116e07d1-042a-4956-e166-3d28bb56780d.png)
Swiftのリンクを押すと画面が遷移します。既出のFizzBuzzコードを実行させた結果です。
![IMG_0040.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6fb63461-daec-1a35-1494-b6abcde166ad.png)
標準入力は、インタラクティブと事前入力の両方をサポートしています。スライドスイッチでインタラクティブを選択しましたが、下記のサンプルコードで`print`出力前に入力待ちになるので、本当の意味でのインタラクティブでは無い気がします。
![IMG_0042.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/da08cc2c-76e4-0454-eb09-053a6c9899ac.png)
事前入力は普通に問題なく動きます。
![IMG_0041.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/b3308259-1a13-b440-0233-5cbe80005f8f.png)
Swiftバージョンは`2.2`, `3.1.1`, `4.1`, `5.1`とメジャーバーションをしっかりサポートしています。
![IMG_0043.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/a6c0c066-8d24-cd5f-78b6-8fb4b00b16f9.png)


## 8. [Online Swift Playground](http://online.swiftplayground.run) 

Swift専用サイトです。
![IMG_0044.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6d3306f2-c3d8-75b6-ff77-e15331e6421d.png)
画面構成は上部がソースコードエリア、下部が実行結果エリアとシンプルです。既出のFizzBuzzコードを実行させた結果です。
![IMG_0045.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/75f88595-1506-e78e-193c-fa17c4cfd6ba.png)
標準入力は無く、`readLine`を**強制アンラップ**すると`signal 4`で落ちます（エラートラップしていない？）。
![IMG_0046.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/0b246af1-0462-5e0d-998b-fc4ed809ab7e.png)
ソースコードエリアと実行結果エリアの境界を動かすことができずちょっと不便です。


# 終わりに

iPadにはApple純正の[Swift Playgrounds](https://www.apple.com/jp/swift/playgrounds/)アプリが存在しますが、`print`結果が簡単に見えない、`readLine`は常に`nil`を返すなど、いわゆるコンソールアプリ的な動作環境としては不向きです。
一方、ここでご紹介したOnlineサービスはブラウザから手軽にSwiftに触れることができるので大変便利です。
皆さんの参考になれば幸いです。

Swiftで書いたコードの実行結果から、そのSwift自身のバージョンを知る方法があれば教えてください。
また、記事の誤り等もご指摘ください。　　　以上です。