今回も前回の予告どおり、
巨人の肩への乗り方
本題に入る前に、
- 新しい言語で一から書き直す
- 今までどおり過去の言語で書く
- 過去の言語の仕様を拡張した言語で書く
- 過去の資産へのインターフェースを設ける
1.の
2.の
3.のobject.
と直感的に書けるところを[object method]
と書かねばならなかったり、
4.の$object.
$object->method()
とC++と同様の
Swiftもまた、
import Framework
前口上はこれくらいにして、
たとえば、
// Playground - noun: a place where people can play
import Cocoa
var str = "Hello, playground"
このコードの尻に、sqrt(2.
と入れてみましょう。期待どおり1.
と右に答えが表示されたはずです。
この状態で、import Cocoa
の行
図1のように、Use of unresolved identifier 'sqrt'
、sqrt
なんて識別子なんて知らん」
![図1 Swiftには平方根の定義がない? 図1 Swiftには平方根の定義がない?](/assets/images/dev/serial/01/swift-introduction/0004/thumb/TH800_001.png)
どうやら、
俺のSwiftにポインタがあるはずがない
import
を使うことで、
しかしそれらの関数の多くは、
Swiftでは、
![図2 『Using Swift with Cocoa and Objective-C』より抜粋 図2 『Using Swift with Cocoa and Objective-C』より抜粋](/assets/images/dev/serial/01/swift-introduction/0004/thumb/TH800_002.png)
ポインタそのものではなく、T *
でなくてUnsafePointer<T>
とはなんとも長ったらしい。これはむしろ改悪なのではないか?
そうならないことは、
#include <stdio.h>
#define BUFSIZE 4096
int main() {
char buf[BUFSIZE];
while(fgets(buf, BUFSIZE - 1, stdin) != NULL){
fputs(buf, stdout);
}
return 0;
}
これをSwiftで書き直すとどうなるか?
import Darwin // or Foundation
let bufsize = 4096
var buf = [Int8]()
buf.reserveCapacity(bufsize)
while fgets(&buf, Int32(bufsize - 1), stdin) != nil
{
fputs(&buf, stdout)
}
ほとんど変わりません。変わったのは、
- Swiftの配列は動的なので、
初期化してから拡張している - Swiftでは中身が書き換わる引数には必ず&を付けることになっているので、
bufではなく&buf - SwiftはCより型にうるさいので、
Int32()を付けている
ぐらいで、int main(){ /*...*/ }
が不要な分、UnsafePointer<T>
のような型宣言はいっさい出てきません。そして型を知りたければ、
![図3 [Option]+クリックでXcodeが教えてくれる 図3 [Option]+クリックでXcodeが教えてくれる](/assets/images/dev/serial/01/swift-introduction/0004/thumb/TH800_003.png)
さらにありがたいのは、ARGV[1]
で指定したファイルの最終更新日stat
に注目してください。構造体そのもののみならず、
import Darwin
if C_ARGC > 1 {
let cfilename = C_ARGV[1]
var st = stat()
if lstat(cfilename, &st) == 0 {
var mtime = st.st_mtimespec.tv_sec
let filename = String.fromCString(cfilename)!
let when = String.fromCString(ctime(&mtime))!
print("\(filename): \(when)")
} else {
perror(cfilename)
}
}
続きは次号
SwiftによるCライブラリへのアクセスを紹介したところで今回は紙幅が尽きてしまいました。次回はObjective-Cへの連携を見ていくことにしましょう。
本誌最新号をチェック!
Software Design 2022年9月号
2022年8月18日発売
B5判/192ページ
定価1,342円
(本体1,220円+税10%)
- 第1特集
MySQL アプリ開発者の必修5科目
不意なトラブルに困らないためのRDB基礎知識 - 第2特集
「知りたい」「使いたい」「発信したい」をかなえる
OSSソースコードリーディングのススメ - 特別企画
企業のシステムを支えるOSとエコシステムの全貌
[特別企画]Red Hat Enterprise Linux 9最新ガイド - 短期連載
今さら聞けないSSH
[前編]リモートログインとコマンドの実行 - 短期連載
MySQLで学ぶ文字コード
[最終回]文字コードのハマりどころTips集 - 短期連載
新生「Ansible」徹底解説
[4]Playbookの実行環境(基礎編)