書いて覚えるSwift入門

第11回 Swiftのオープンソース化

この記事を読むのに必要な時間:およそ 3 分

REPL

それでは,早速ターミナルから,

$ ̃/swift/usr/bin/swift

と叩けば,REPLが起動します。フルパスが面倒なら,

$ export PATH=$HOME/swift/usr/bin:$PATH

などで̃/swift/usr/binをパスに追加しておけば,swiftだけでOKです。

Rubyにおけるirbや引数なしのpythonを実行したのと同様に,対話的にSwiftを使うことができます図3⁠。

図3 Linux上で動くSwift

図3 Linux上で動くSwift

Tips

このREPL,irbやインタラクティブモードのpythonと比べると,少しモダンになっています。

関数/メソッド補完

そのひとつは,関数やメソッドを補完してくれることです。たとえば1.と打った後で[Tab]を打つと……,

  1> 1.
Available completions:
  advancedBy(n: Distance) -> Int
  advancedBy(n: Int, limit: Int) -> Int
  bigEndian: Int
  byteSwapped: Int
  description: String
  distanceTo(other: Int) -> Distance
  hashValue: Int
  littleEndian: Int
  predecessor() -> Int
  stride(through: Int, by: Distance) ->
StrideThrough<Int>
  stride(to: Int, by: Distance) ->
StrideTo<Int>
  successor() -> Int
  toIntMax() -> IntMax
  1> 1.successor()
$R0: Int = 2

...Intのインスタンスメソッドが表示されますし,さらにsuと打って[Tub]tを打つと,.successor()まで補完してくれます。

ブロック編集のサポート

SwiftのREPLのヒストリーは,行単位ではなくブロック単位です。たとえば,

  1> (1...10).reduce(0) {
  2. $0 + $1
  3. }
$R0: Int = 55

この状態で[↑]キーを押すと,3行に渡るこのブロックが丸ごと再表示されます。reduce(0)reduce(1)に,$0 + $1を$0 * $1に編集して,最後に}の後ろまでカーソルを移動してから[Enter]キーを押すと……,

  4> (1...10).reduce(1) {
  5. $0 * $1
  6. }
$R1: Int = 3628800

となります。ブロックの終了,つまり}以前にリターンした場合,そのまま行挿入もできます。

import Glibc

Swiftは強力な言語です。しかしPerlやPythonやRubyなどのスクリプト言語と異なり,生のSwiftは三角関数を1つサポートしていません。

  7> let pi = -2 * atan2(-1, 0)
repl.swift:7:15: error: use of unresolved
identifier 'atan2'
let pi = -2 * atan2(-1, 0)

新規playgroundで,iOSならimport UIKitOS Xならimport Cocoaという「呪文」が最初から入っているのは,そのためです。残念ながらLinux版のSwiftにはまだplaygroundはないのですが,Linuxでは何をインポートするのがそれに相当するのでしょうか?

import Glibcだそうです。連載第7回で筆者が予想したimport POSIXではなく。

  7> import Glibc
  8> let pi = -2 * atan2(-1, 0)
pi: Double = 3.1415926535897931

これを#ifと組み合わせると,クロスプラットフォームなSwiftコードが書けそうです。リスト1のコードは,Linuxと OS X双方でchmod+xしたうえでスクリプトとして実行可能で,swiftc pi.swiftでコンパイルしても動くことを確認しました。

リスト1 pi.swift

    #!/usr/bin/env swift
    #if os(OSX)
    import Cocoa
    #elseif os(iOS)
    import UIKit
    #elseif os(Linux)
    import Glibc
    #endif
    let π = -2 * atan2(-1.0, 0.0)
    print("π = \(π)")

あらためて,オープンソースであるということ

公約どおり,Swiftはオープンソースとなりました。ここで2つの疑問が湧いてきます。

  • なぜ,オープンソースにしたのか?
  • なぜ,はじめからオープンソースにしなかったのか?

この2つの疑問に対し,連載第7回時点の筆者はこう答えています。

食えなきゃ誰も食ってくれない。オープンでなければ,誰も食いつづけてくれない。

WWDC2014におけるデビューからわずか1年半,iOSとOS Xのリリースサイクルわずか1回分で,SwiftはiOSアプリ開発における第一言語となっています。オープンソースとなる前から,⁠食える言語」という地位は,すでに確立したわけです。しかし,Xcode以外の実装を持たなかったSwiftは,真の意味での汎用言語ではありませんでした。⁠どんなプログラムでも書ける」では汎用言語としては十分ではありません。⁠どんなプラットフォーム上でも」も成立して,はじめて汎用と呼べるのです。オープンソース化は,そのための最短距離でもあります。Apple自身はLinux,それもUbuntuしか現時点でサポートしていませんが,リリースから1日も経たずして,すでにGitHubでは他のプラットフォームへの移植が雨後の筍のように始まっています。⁠言語の普及競争において,Swiftほど高いオッズを持つ言語が見当たりません」と連載第7回時点で筆者は言いましたが,オープンソース化の公約を果たした今,オッズはさらに高まったのは確かでしょう。

Appleプラットフォームとは無縁だった読者も,今後本連載はスルーできなくなったのではないでしょうか。

Software Design

本誌最新号をチェック!
Software Design 2021年7月号

2021年6月17日発売
B5判/184ページ
定価1,342円
(本体1,220円+税10%)

  • 第1特集
    先駆けに学ぶゼロトラストの現実解
    リモートワークに必須のセキュリティモデル
  • 第2特集
    IT技術の総力戦
    ISUCONで学ぶパフォーマンスチューニング
  • 特別企画
    WSL 2本格入門
    何ができるか,どこまでできるか
  • 特別企画
    5分で試す,機械学習を用いたワクチン開発の世界
    自然言語処理技術との類似と相違
  • 短期連載
    GitOpsで作るKubernetesのCI/CD環境
    [1]GitOps超入門

著者プロフィール

小飼弾(こがいだん)

1969年生まれ,東京都出身。元ライブドア取締役の肩書きよりも,最近はPokemon GOのガチトレーナーのほうが有名になりつつある……かもしれない永遠のエンジニアオヤジ。

活躍の場はIT業界だけでなく,サブカルからアカデミックまで多方面にわたり,ネットからの情報発信は気の向くまま毎日毎秒! https://twitter.com/dankogai,ニコニコチャンネルは,http://ch.nicovideo.jp/dankogai,blogはhttp://blog.livedoor.jp/dankogai/

当社刊行書籍は『小飼弾のアルファギークに逢ってきた』『小飼弾のコードなエッセイ』など。他にも著書多数。