Introducing Swift
WWDC2014で
![図1 Swiftリリース紹介ページ 図1 Swiftリリース紹介ページ](/assets/images/dev/serial/01/swift-introduction/0000/thumb/TH800_001.png)
どんな言語でしょうか。Apple は
Swift is an innovative new programming language for Cocoa and Cocoa Touch. Writing code is interactive and fun, the syntax is concise yet expressive, and apps run lightning-fast. Swift is ready for your next iOS and OS X project―or for addition into your current app―because Swift code works side-by-side with Objective-C.
弾訳
「SwiftはCocoaおよびCocoa Touch用の革新的新言語です。コードを書くのはインタラクティブで楽しく、文法は簡潔ながら表現力が高く、 アプリは超高速で動きます。SwiftはiOSおよびOS Xでいますぐ利用可能で、 Objective-Cと並存可能なので、 既存のアプリへの追加もできます」
この口上だけ見ると、
本連載では、
Shut the F?ck up and Write Some Code!
読者の皆さんは、
しかし処理系であるXcodeも、
とりあえずFizzBuzz
というわけで、
本誌の読者であれば、
for n in 1...100 {
if n % 15 == 0 {
println("FizzBuzz")
} else if n % 5 == 0 {
println("Buzz")
} else if n % 3 == 0 {
println("Fizz")
} else {
println(n)
}
}
このコード片を、
![図2 playgroundにリスト1を入力! 図2 playgroundにリスト1を入力!](/assets/images/dev/serial/01/swift-introduction/0000/thumb/TH800_002.png)
たしかに仕様どおりに動いているようです。
ここで、
- ① リスト2の内容のFizzBuzz.
javaを作成する - ② javac Fizzbuzz.
javaコンパイルする - ③ java FizzBuzzで実行する
public class FizzBuzz {
public static void main(String[] args) {
for (int i=1; i<=100; i++) {
if (i % 15 == 0) {
System.out.println("FizzBuzz");
} else if (i % 3 == 0) {
System.out.println("Fizz");
} else if (i % 5 == 0) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
}
}
同じことをするのにも、public Class FizzBuzz
とpublic static void main(String[] args)
でくるまなければならないですし、FizzBuzz.
でなければならないですし、javac
でコンパイルしてjava
で実行しなければなりません。コードの部分はほとんど同じなのに、
「簡単なことは簡単に。難しいこともそれなりに」
MVCは分けましょう
しかし手練れのプログラマであれば、
そうするにはどうしたらよいでしょう。そう。関数ですね
func fizzbuzz(n:Int) -> String {
if n % 15 == 0 { return "FizzBuzz" }
if n % 5 == 0 { return "Buzz" }
if n % 3 == 0 { return "Fizz" }
return String(n)
}
for n in 1...100 {
println(fizzbuzz(n))
}
Swiftもほかのプログラミング言語同様、func
。Perlのsub
やRubyのdef
より1文字多いですが、function
の半分。ただし型は宣言しなければなりません。引数は数値のInt
。戻り値は文字列のString
。そう。SwiftはCやC++やJava同様、
オブジェクト(思考|志向|嗜好)
「数値を文字列にする関数」
class Fixnum
def fizzbuzz()
if self % 15 == 0 then return "FizzBuzz" end
if self % 5 == 0 then return "Buzz" end
if self % 3 == 0 then return "Fizz" end
return self.to_s
end
end
(1..100).each do ¦n¦
puts n.fizzbuzz
end
extension Int {
func fizzbuzz() -> String {
if self % 15 == 0 { return "FizzBuzz" }
if self % 5 == 0 { return "Buzz" }
if self % 3 == 0 { return "Fizz" }
return String(self)
}
}
for n in 1...100 {
println(n.fizzbuzz())
}
Rubyでは新たなクラスを定義するときも、class
ですが、extension
を使います。何をしているのかこちらのほうがわかりやすいです。
しかしRubyと比べると、()
が不恰好というか括弧が余計に見えます。これを取り除くことはできないでしょうか? ――できます。リスト6を見てください。
extension Int {
var fizzbuzz:String {
if self % 15 == 0 { return "FizzBuzz" }
if self % 5 == 0 { return "Buzz" }
if self % 3 == 0 { return "Fizz" }
return String(self)
}
}
for n in 1...100 {
println(n.fizzbuzz)
}
変数のふりをしたメソッドをゲッター
ところでRubyでは、[]
という名前のメソッドを定義してしまえばよいのです。Swiftではどうでしょうか? ――はい。これも、[]
ではなくsubscript
ですが。
class FizzBuzz {
subscript (n:Int)->String {
if n % 15 == 0 { return "FizzBuzz" }
if n % 5 == 0 { return "Buzz" }
if n % 3 == 0 { return "Fizz" }
return String(n)
}
}
let fizzbuzz = FizzBuzz()
for n in 1...100 {
println(fizzbuzz[n])
}
しかし添字のふりをした引数だけではまだ十分配列とは言えません。RubyのEnumerable
のように、
// class FizzBuzz { ... } はそのまま
extension FizzBuzz : SequenceType {
func generate() -> GeneratorOf<String> {
var n = 0
return GeneratorOf<String> {
if n == 100 { return nil }
return self[++n]
}
}
}
let fizzbuzz = FizzBuzz()
for s in fizzbuzz {
println(s)
}
nilほどオプショナル
ところでSwiftに関してググってみると、
「a language for the rest of us」
の観点から言うとSwiftのoptional型は大変素晴らしい
実際に見てみましょう。今度は
let fizzbuzz = [
3:"Fizz",5:"Buzz",6:"Fizz",9:"Fizz",
10:"Buzz",12:"Fizz",0:"FizzBuzz"
]
for n in 1...100 {
println(fizzbuzz[n % 15] ?? String(n))
}
たしかにきちんと動いているようですが、?? String(n)
を削除してみてください。どうなりましたか? 連想配列のキーがあるところはOptional("")
、nil
と表示されたはずです。
ここで、fizzbuzz[n]
の型を考えてみましょう。単にString
だと、n
に対応する値がない場合に困ってしまいます。Optional
は、Either
ですね。
これで、??
の意味が見えてきました。nil
という名前がついています。
次回予告
ここまで、
しかしSwiftの
本誌最新号をチェック!
Software Design 2022年9月号
2022年8月18日発売
B5判/
定価1,342円
- 第1特集
MySQL アプリ開発者の必修5科目
不意なトラブルに困らないためのRDB基礎知識 - 第2特集
「知りたい」 「使いたい」 「発信したい」 をかなえる
OSSソースコードリーディングのススメ - 特別企画
企業のシステムを支えるOSとエコシステムの全貌
[特別企画] Red Hat Enterprise Linux 9最新ガイド - 短期連載
今さら聞けないSSH
[前編] リモートログインとコマンドの実行 - 短期連載
MySQLで学ぶ文字コード
[最終回] 文字コードのハマりどころTips集 - 短期連載
新生「Ansible」 徹底解説
[4] Playbookの実行環境 (基礎編)