仕事で TypeScript、趣味で Swift を書いている自分用の比較表です。TypeScript は JavaScript や ES6 なども含みます。随時更新します。編集リクエスト大歓迎です。
定数・変数
Swift
let i = 0
var a = "a"
TypeScript
const i = 0;
let a = "a";
基本的な型
Swift | TypeScript | Note |
---|---|---|
Int |
number |
|
Float |
number |
|
Double |
number |
|
- | bigint |
|
Bool |
boolean |
|
String |
string |
|
- | symbol |
|
Array |
Array |
|
Dictionary |
Object |
|
nil |
null |
|
- | undefined |
|
Void |
void |
|
Any |
unknown |
文字列補間
Swift
let n = 10
"\(n) times." // 10 times.
TypeScript
const n = 10;
`${n} times.` // 10 times.
enum (列挙型)
Swift
enum Fruit: String {
case Orange = "🍊"
case Apple = "🍎"
case Banana = "🍌"
}
print(Fruit.Orange.rawValue) // 🍊
TypeScript
enum Fruit {
Orange = "🍊",
Apple = "🍎",
Banana = "🍌",
}
console.log(Fruit.Orange); // 🍊
Array(配列)
範囲外のアクセス
Swift
let i = 10
let numbers = [1, 2, 3]
print(numbers[i]) // EXC_BAD_INSTRUCTION
if i < numbers.count {
...
}
TypeScript
const i = 10;
const numbers = [1, 2, 3];
console.log(numbers[i]); // undefined
if numbers[i] !== undefined {
...
}
Swift も if let
とかでチェックできるといいのだけど...
Object / Dictionary
基本
Swift
var dict: [String: Any] = [:]
dict["abc"] = 123
print(dict["abc"] ?? "No value")
TypeScript
let obj: { [_: string]: any } = {};
obj['abc'] = 123;
console.log(obj['abc'] || 'No value');
存在確認
Swift
var fruits = [
"apple": "🍎",
"orange": "🍊"
]
if let apple = fruits["apple"] {
print(apple)
}
キーが存在しない場合は nil
を返す。
TypeScript
const fruits = {
apple: "🍎",
orange: "🍊"
};
if ('apple' in fruits) {
console.log(fruits['apple']);
}
キーが存在しない場合は undefined
を返す。
マージ(新しい方で上書き)
Swift
var a = ["apple": "🍎",
"orange": "🍊"]
let b = ["apple": "🍏",
"banana": "🍌"]
let merged = a.merging(b) { _, new in new }
// ["apple": "🍏", "banana": "🍌", "orange": "🍊"]
TypeScript
const a = {
apple: "🍎",
orange: "🍊"
}
const b = {
"apple": "🍏",
"banana": "🍌"
}
const merged = Object.assign({}, a, b)
// {apple: "🍏", orange: "🍊", banana: "🍌"}
どっちも面倒臭い。どっちも shallow マージ。
struct (構造体)
Swift
struct Person {
var name: String
var age: Int
};
let person = Person(name: "Taro", age: 20)
TypeScript
type Person = {
name: string;
age: number;
}
const person: Person = {
name: "Taro",
age: 20
};
TypeScript の type
を構造体とみなしていいのかどうかはわからない...
class (クラス)
Swift
class Person {
// メンバ変数
var word: String
// コンストラクタ(イニシャライザ)
init(word: String) {
self.word = word
}
// デストラクタ(例はイマイチ)
deinit {
self.word = "Bye..."
}
// メソッド
func say() -> String {
return self.word
}
}
let person = Person(word: "Hello!")
person.say()
TypeScript
class Person {
// メンバ変数
word: string;
// コンストラクタ(イニシャライザ)
constructor(word: string) {
this.word = word;
}
// メソッド
say() {
return this.word;
}
}
const person = new Person("Hello!");
person.say();
TypeScript にはデストラクタはない模様。
タイマー
Swift
let timer = Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false) { timer in
print("Fired")
}
timer.invalidate() // Stop the timer
TypeScript
// 繰り返しの時は、setInterval() を使う
const timer = setTimeout(() => {
console.log("Fired");
}, 3000);
clearTimeout(timer); // Stop the timer
ToDo
- プリミティブ型
- any / void
- function / closure
- getter / setter
- キャスト
- ループ
- while / do while
- if / switch
- Array / Set
- .count, .length
- 比較演算子
- &&, ||, ??
- 三項演算子
- 分割代入
- スプレッド構文
- 可変長引数
- protocol
- interface
- extension
- typeof / instanceof / in / of
- optional
- タプル
- guard
- if let = ...
- range
- ヒアドキュメント
- 長さ(文字列、配列)
- Error
- マクロ関連
- 環境変数
- _
- subscript
- undefined
- Never
- union
- ジェネリクス
- typealias
- some / where
- weak / unowned
- lazy
- async / await
- yield
- public / private / etc...
- static
- print / console.log
- module / namespace
- コメントアウト