Skip to content

Instantly share code, notes, and snippets.

@YusukeHosonuma
Last active August 29, 2015 14:02
Show Gist options
  • Save YusukeHosonuma/263c01f350e9ba9bf83e to your computer and use it in GitHub Desktop.
Save YusukeHosonuma/263c01f350e9ba9bf83e to your computer and use it in GitHub Desktop.
let old = 17
let foo = "I am \(old) old years."
let foo = "I am \(old) old years."
var array = ["apple", "orange", "banana"]
var array = ["apple", "orange", "banana"];
// 変数:型 で引数指定
// -> で関数の戻り値の型を指定
// (だいたいScalaの構文をそのまま持ち込んでる印象)
func greet(firstName: String, lastName: String) -> String {
return "My name is \(firstName) \(lastName)."
}
greet("Yamada", "Taro")
// 変数:型 で引数指定
// -> で関数の戻り値の型を指定
// (だいたいScalaの構文をそのまま持ち込んでる印象)
func greet(firstName: String, lastName: String) -> String {
return "My name is \(firstName) \(lastName)."
}
greet("Yamada", "Taro")
func foo() -> (Int, Int, Int) {
}
// Scalaと違って配列で返すので数の制限は無し?
func foo() -> (Int, Int, Int) {
}
// Scalaと違って配列で返すので数の制限は無し?
for sum(numbers: Int...) -> Int {
}
for sum(numbers: Int...) -> Int {
}
func foo() {
func bar() {
}
bar()
}
func foo() {
func bar() {
}
}
// conditionに「Intを引数にBoolを返す関数」を受け取る
func numberFilter(numbers: Int[], condition: Int -> Bool) -> Int[] {
}
// 「Int型を引数に取り、Int型を返す関数」を返す関数
func foo() -> (Int -> Int) {
}
// conditionに「Intを引数にBoolを返す関数」を受け取る
func numberFilter(numbers: Int[], condition: Int -> Bool) -> Int[] {
}
// 「Int型を引数に取り、Int型を返す関数」を返す関数
func foo() -> (Int -> Int) {
}
// 数値配列numbersの値を全て2倍にする
numbers.map({
(number: Int) -> Int in
let result = number * 2
return result
})
// 省略するとここまで短く書ける
numbers.map({ number in number * 2 })
// ちなみにこんなことも(シンタックスシュガーでしょうが)
sort([1, 5, 3, 12, 2]) { $0 > $1 }
// 数値配列numbersの値を全て2倍にする
numbers.map({
(number: Int) -> Int in
let result = number * 2
return result
})
// 省略するとここまで短く書ける
numbers.map({ number in number * 2 })
// ちなみにこんなことも(シンタックスシュガーでしょうが)
sort([1, 5, 3, 12, 2]) { $0 > $1 }
class Person {
// インスタンス変数
// 全てのインスタンス変数は宣言またはinitで初期化する必要がある
var name: String
var age: Int = 0
// コンストラクタ
init(name: String) {
self.name = name
}
// メソッド
func greet() -> String {
}
// deinitを宣言するとデストラクタとして機能する
}
class Person {
// インスタンス変数
// 全てのインスタンス変数は宣言またはinitで初期化する必要がある(コンパイラ要件?)
var name: String
var age: Int = 0
// コンストラクタ
init(name: String) {
self.name = name
}
// メソッド
func greet() -> String {
}
// deinitを宣言するとデストラクタとして機能する
}
var person = Person() // newキーワードなし(ScalaのTypeClassみたい)
var person = Person() // newキーワードなし(ScalaのTypeClassみたい)
override func foo() -> String {
}
override func foo() -> String {
}
// :のあとに親クラス名(だいたい最近のモダン言語と同じシンタックス)
class Person: Animal {
}
// :のあとに親クラス名(だいたい最近のモダン言語と同じシンタックス)
class Person: Animal {
}
var names = [
"Yamada": "Taro",
"Tanaka": "Jirou",
]
var names = [
"Yamada": "Taro",
"Tanaka": "Jirou",
]
var foo: Int {
get {
return bar * 2 // 意味のあるコードではありません
}
set {
foo = newValue / 2 // setの値は`newValue`に格納される
}
var foo: Int {
get {
return foo * 2
}
set {
foo = newValue / 2 // setの値は`newValue`に格納される
}
// 値の取得・設定をカスタマイズしたくはないけど監視だけしたい場合は以下のようにする
// CocoaTouchで採用されているKVOを実現するための機構?
var foo: Int {
willSet {
}
}
// 値の取得・設定をカスタマイズしたくはないけど監視だけしたい場合は以下のようにする
// CocoaTouchで採用されているKVOを実現するための機構?
var foo: Int {
willSet {
}
}
// 宣言
class Person {
// 第2引数はシグネチャとしては`lastName`、内部変数としては`ln`が採用される
// (これにより無駄にコードが長くなることがなくなりそう)
func greet(firstName: String, lastName ln: String) -> String {
return "My name is \(firstName) \(ln)."¥
}
}
// 呼び出し
ver yamada = Person()
yamada.greet("Yamada", lastName: "Taro") // この辺りはObjective-Cゆずり
// 宣言
class Person {
// 第2引数はシグネチャとしては`lastName`、内部変数としては`ln`が採用される
// (これにより無駄にコードが長くなることがなくなりそう)
func greet(firstName: String, lastName ln: String) -> String {
return "My name is \(firstName) \(ln)."¥
}
}
// 呼び出し
ver yamada = Person()
yamada.greet("Yamada", lastName: "Taro") // この辺りはObjective-Cゆずり
// このあたりHaskellのLeft|Rightを思い出す
enum Result {
case Success(String, String)
case Error(String)
}
// このあたりHaskellのLeft|Rightを思い出す
enum Result {
case Success(String, String)
case Error(String)
}
protocol ExampleProtocol {
var foo: String { get } // 必須のreadプロパティ
mutating func bar() // ミュータブルな操作としてのマーク?(よく分からん)
}
protocol ExampleProtocol {
var foo: String { get } // 必須のreadプロパティ
mutating func bar() // ミュータブルな操作としてのマーク?(よく分からん)
}
// 継承と一緒(継承と一緒にやりたい場合どうするんだろ?)
class Person: ExampleProtocol {
}
// 継承と一緒(継承と一緒にやりたい場合どうするんだろ?)
class Person: ExampleProtocol {
}
// 旧カテゴリ拡張だけどもScalaを彷彿とさせる・・・
// (以下だいたい本からの丸写し)
extension Int: ExampleProtocol {
var simpleDescription: String {
return "I am a number of \(self)."
}
mutating func adjust() {
self += 42
}
}
7.simpleDescription
// 旧カテゴリ拡張だけどもScalaを彷彿とさせる・・・
// (以下だいたい本からの丸写し)
extension Int: ExampleProtocol {
var simpleDescription: String {
return "I am a number of \(self)."
}
mutating func adjust() {
self += 42
}
}
7.simpleDescription
// あえてJava風にTとか書いてみる
func repeat<T>(item: T, times: Int) -> T[] {
}
// あえてJava風にTとか書いてみる
func repeat<T>(item: T, times: Int) -> T[] {
}
// だいたいJavaと同じ
let emptyArray = String[]()
let emptyDictionary = Dictionary<String, Float>()
// だいたいJavaと同じ
let emptyArray = String[]()
let emptyDictionary = Dictionary<String, Float>()
for player in players {
}
for player in players {
}
if old < 20 {
} else {
}
// 条件式全体を()で囲む必要がない!
if old < 20 {
} else {
}
// 条件式全体を()で囲む必要がない!
var optionalString: String? = "Hello"
if let foo = optionalString {
// ここではfooがnilでないことが保証される?
}
// ScalaのOption型と似た考え方。
var optionalString: String? = "Hello"
if let foo = optionalString {
// ここではfooがnilでないことが保証される?
}
// ScalaのOption型を構文に組み込んだ印象を受けるが(英語力が不足してわからない)
let filename = "foo.txt"
switch filename {
case: "bar.txt":
// 明示的なbreakは不要
case: let f where f.hasSuffix(".txt")
// let where による条件判定
default:
// default
}
let filename = "foo.txt"
switch filename {
case: "bar.txt":
// 明示的なbreakは不要?
case: let f where f.hasSuffix(".txt")
// let where による条件判定
default:
// default
}
// 型を明示しないで良い
for (name, phoneNumbers) in addresses {
}
// 型を明示しないで良い
for (name, phoneNumbers) in addresses {
}
for i in 0..3 {
}
for i in 0..3 {
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment