Swift 言語のホワイトペーパー眺めてみた
言語仕様が scala じみてると言われるが、個人的にシンタックスは CoffeeScript に近い気がする。 let とか var の書き方は F# に近い印象? if, for が statement (句)って言ってるのが残念。function で居て欲しかった。 型宣言は Scala か、デフォルトで null 禁止はいいね。nullable にする場合 ? 修飾って C#?
var optionalName: String? = "John Appleseed” var greeting = "Hello!" if let name = optionalName { greeting = "Hello, \(name)" }
if let は optionalName を評価して値が入ってれば {} の結果を name に設定する。 nil だとコードブロックは無視されて name に nil が入るのか。 短い構文発見
var optionalName: String? = "John Appleseed” let nameLength = optionalName?.length()
基本的に nil は false として条件判定出来るらしい。 ってかこれ scala だとこうなる。
val optionalName = Some("John Appleseed") val greeting = "Hello" val name = optionalName.map(s => s"Hello, $s")
正直、filter, foreach とか欲しかった。 isDefined 要らずは良いけどね。 switch - case 文は Scala の match - case 式に近い印象。 ガード条件で処理が書けるのは正直ありがたい。 foreach の記述が
let hash = [ "azalea":[2,4,8,16], "armeria":[1,3,5,7] ] for (name, value) in hash { for num in value { println("Name \(num) comtains \(num)") } }
でイテレート可能か。 for-in 句だと Coffee の方が近いか。 while, do-while 句もあるのか。 ただしこの扱いはやはり構文(statement)なので、return してこない。マジ残念。
関数型として高階関数が仕えるのはいい。 function の定義式が下記。
func functionName(arg: ArgType) -> ReturnType { return ... }
関数もネストすれば高階にできる。 ってーかカリー化マダー?
一応関数型だけあって、イテレート可能型に map 関数が存在するのはいい感じだ。
let nums = [1,2,4,8,16] nums.map({ (num: Int) -> Int in return num * 2 })
1行省略
let nums = [1,2,4,8,16] nums.map({ num in num * 2 })
引数参照を使えば引数名を省略できる
let nums = [1,2,4,8,16] nums.map({ $0 * 2 })
個人的に関数と定数・変数の型宣言に一貫性が無いのは気になった。
let name: String = "HAHAHA" func getName() -> String { return name }
比較対象:scala
val name: String = "HAHAHA" def getName(): String = name
object 指向もなかなかいい感じ。
class Name { var name: String init(name: String) { self.name = name } func getName() -> String { return self.name } }
ただし、コンストラクタがこの形状だと、クラス内に定数を置くのがやや面倒か。
class Name { let name: String // これは初期化できない init(name: String) { self.name = name } func getName() -> String { return self.name } }
親クラス参照は super
で、親コンストラクタは super.init()
でアクセス出来る。
どうも「親コンストラクタはコンストラクタの第一行でしか呼べない」という様な仕様はないらしい。
継承自体も結構シンプル
class Base { var n: String init(n: String) { self.n = n } var prop: String { get { return self.n } set { self.n = "Set: \(newValue)" } } func hello() -> String { return "Hello, \(self.n)" } } class Child: Base { init() { super.init("HAHAHA") } override func hello() -> String { return "Child : \(self.n)" } }
フィールドのアクセス権限はデフォルトで public らしい。 willSet, didSet は objective-c のKVOに相当するのか? それぞれ値を設定される直前、直後に実行されるコールバック
class User { var name: String { willSet { nameLength = newVakue.length() } } var nameLength: Int }
いや、この言語の String に length メソッドあるか知らないけどさ…
enum は scala よりいい感じ(つーか scala のアレが悪名高杉w)
enum Employee: Int { case CEO = 1 case CTO, Sales, Developper func desc() -> String { case .CEO: return "社長" case .CTO: return "最高技術責任者" case .Sales: return "営業" case .Developper: return "開発" } } let hira = Employee.Deevelopper println(hira.desc())
今日はここまで。