Created
August 1, 2014 07:57
-
-
Save iZRIdJJ53S/5e49477e61bd6d913f08 to your computer and use it in GitHub Desktop.
Apple Swift - 入門 - チュートリアル
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Playground - noun: a place where people can play | |
import UIKit | |
var str = "Hello, playground" | |
println("Hello Swift") | |
// 一行コメント | |
/* 複数行コメント */ | |
// 文末を表すセミコロンは普通は書かない | |
// 定数はletで定義する。変数はvarで定義する。 | |
var myVar = 42 | |
myVar = 50 | |
let myConst = 42 | |
//myConst = 1 | |
// => error:cannot assign to 'let' value 'myConst' | |
let implicitDouble = 70.0 | |
let explicitDouble: Double = 70 | |
let errorCode = 94 | |
//"error code: " + errorCode | |
//=> error: could not find an overload for '+' that accepts the supplied arguments | |
// printlnまたはprintで出力できる(printは改行なし) | |
println("error code: " + String(errorCode)) | |
/** | |
* -------------------------- | |
* 文字列 | |
* -------------------------- | |
*/ | |
// 文字列リテラルはダブルクオートで囲む | |
// 文字列の連結には+演算子を使う | |
var name = "Swift" + " " + "Programming" | |
name += " Language" | |
// 文字列の長さはグローバル関数countElementsで分かる | |
countElements(name) | |
/** | |
* -------------------------- | |
* 配列 | |
* -------------------------- | |
*/ | |
// 配列はブラケットを使って定義する | |
var colours = ["red", "black", "white", "blue"] | |
// 空の配列は、初期化子構文で定義する | |
//let names = String[]() | |
// 配列の要素にアクセスするには、インデックスをブラケット中に書く | |
// インデックスはゼロ始まり | |
colours[0] = "pink" | |
// 要素追加は+=演算子 | |
colours += "grey" | |
// 配列の要素数はcountプロパティー | |
colours.count | |
// 要素をイテレートするにはfor-inを使う | |
for colour in colours { | |
println(colour) | |
} | |
/** | |
* ---------------------- | |
* ハッシュ dictionary | |
* ---------------------- | |
*/ | |
// ハッシュはブラケットを使って、キーとバリューをコロン区切りにして定義する | |
var petCounts = ["dog": 2, "cat": 3] | |
// 空ハッシュは、初期化子構文で定義する | |
var wordCounts = Dictionary<String, Int>() | |
// ハッシュの要素にアクセスするには、キーをブラケット中に書く | |
wordCounts["dog"] = petCounts["dog"] | |
// 要素数はcountプロパティー | |
// キー一覧の取得はkeysプロパティー | |
// 値一覧の取得はvaluesプロパティー | |
wordCounts.count | |
wordCounts.keys | |
wordCounts.values | |
// ハッシュの要素をイテレートするにはfor-inを使う | |
for (pet, count) in petCounts { | |
println(pet + ":" + String(count)) | |
} | |
/** | |
* ----------------------- | |
* 真偽値 | |
* ----------------------- | |
*/ | |
// 型を指定する場合は、Boolと書く | |
var endFlag : Bool = false | |
// trueまたはfalseどちらか(小文字表記のみ可)の値を持つ | |
endFlag = true | |
/** | |
* ------------------------------- | |
* 関数の定義と呼び出し - 入門 | |
* ------------------------------- | |
*/ | |
// 関数を定義するためにfuncを使う | |
// パラメーターの後ろに->につづけて関数の戻り値の型を書く | |
func createMessage(title: String, body: String) -> String { | |
return "title: \(title)\nbody: \(body)" | |
} | |
createMessage("task", "mail John") | |
// パラメーター名は呼び出し側で使う名前も指定できる | |
// - 呼び出し側と関数内部で使う名前をスペース区切りで指定できる | |
// - 関数内部の名前と同じでよければ、#をつけておく | |
func createMessage2(title t: String, #body: String) -> String { | |
return "title: \(t)\nbody: \(body)" | |
} | |
createMessage2(title: "task", body: "call John") | |
/** | |
* -------------------------- | |
* 条件分岐 if、三項演算子 | |
* -------------------------- | |
*/ | |
// 条件前後の括弧は書かなくても良い。本体前後の括弧は必須 | |
func rank(score : Double) -> String { | |
// if文の条件はブール値(あるいは後述のオプショナル値)でなければならない | |
// - 数値がブール値に型変換されたりしない。if score {}みたいなコードはエラーである | |
if (score > 90) { | |
return "A" | |
} else if score > 70 { | |
return "B" | |
} else { | |
return "C" | |
} | |
} | |
// 三項演算子も使える | |
let score = 99 | |
score > 90 ? "OK" : "NG" | |
/** | |
* -------------------- | |
* オプショナル値 | |
* - 値があるかもしれないし、ないかもしれないことを表すために、オプショナル値を使う | |
* -------------------- | |
*/ | |
// オプショナル値型であることを表すために、型名に?を付ける | |
func createMessage(optionalTitle : String?, optionalContent : String?) -> String? { | |
var message = "" | |
// if文でオプショナル値に値があるか知ることができる。あればtrue、なければfalse扱い | |
if optionalTitle { | |
//値を持つオプショナル値は!を付けることで値を取り出せる | |
message += "title: " + optionalTitle! + "\n" | |
} | |
// if let tmpVar = OptionalVar 構文でオプショナル値のありなし判定と同時に値を変数 | |
// に束縛できる(Optional Bindingという) | |
if let content = optionalContent { | |
message += "content: " + content | |
} | |
// 値がないことを表すのにnilを使う(Nilとかnullとかはない) | |
if message == "" { | |
return nil | |
} else { | |
return message | |
} | |
} | |
// オプショナル値を利用する時には、メソッドやプロパティーや[]などの操作の前に?を書くことが出来る | |
// - もし、?の前の値がnilであれば、 | |
// - ?以降のもの全てが無視される | |
// - 全体の式の値はnilである。 | |
// - ?の前の値がnilでなければ、 | |
// - オプショナル値はunwrapされる | |
// - ?以降の全てがunwrapされた値に対して作用する | |
func messageCount(optionalMessages: Array<String>?) -> Int? { | |
return optionalMessages?.count | |
// => optionalMessages!.count または nil | |
} | |
func lastItem(items : Array<Int>?) -> Int? { | |
return items?[items!.count - 1] | |
} | |
/** | |
* ------------------------ | |
* 条件分岐 switch | |
* ------------------------ | |
*/ | |
// switchでは(整数値の等値チェックに限らず)任意の種類のデータと様々な比較演算子が利用できる | |
// マッチしたcaseの中のコード実行後には、プログラムはswitch文から抜ける | |
// - 実行は次のcaseに続かないので、caseの最後で明示的にbreakしなくてよい | |
func evaluate(diff : Int) -> String? { | |
switch diff { | |
case 100: | |
return "max" | |
case let x where 0 < x && x < 100: | |
return "up" | |
case 0: | |
return "-" | |
case let x where x < 0: | |
return "down" | |
default: | |
return nil | |
} | |
} | |
/** | |
* -------------------- | |
* よく使う演算子の紹介 | |
* -------------------- | |
*/ | |
// 代入:= | |
// 値を返さない(==と間違えて使われるのを避けるため) | |
// 算術演算子:+ - * / % | |
// だいたいいつも通りの使い方が出来る | |
// インクリメント/デクリメント:++ -- | |
// 前置も後置もできる | |
// 複合代入演算子:+=みたいなやつ色々 | |
// 比較演算子:== != > < >= <= | |
// 範囲演算子:.. ... | |
// 1..5 => 1,2,3,4 | |
// 1...5 => 1,2,3,4,5 | |
// 論理演算子:! && || | |
/** | |
* ------------------------------- | |
* ループ(for、while、do-while) | |
* ------------------------------- | |
*/ | |
// 初期化;条件;インクリメントを明示的に書くことも出来る | |
var sum2 = 0 | |
for var i = 0; i < 3; ++i { | |
sum2 += 1 | |
} | |
// whileループは、条件が変化するまでコードブロックを繰り返すために使う | |
var x = 1 | |
while x < 100 { | |
x = x * 2 | |
} | |
// whileの条件は、ループが少なくとも一回は実行されることを保証するために、最後におくことも出来る | |
var y = 2 | |
do { | |
y = y * 2 | |
} while y < 100 | |
/** | |
* ---------------------------- | |
* 関数の定義と呼び出し - 初級編 | |
* ---------------------------- | |
*/ | |
// 関数から複数の値を返すためにタプルを使う | |
func getProfile() -> (name: String, age: Int, size: Double) { | |
return ("Steve", 46, 8.9) | |
} | |
let profile = getProfile() | |
println("name: " + profile.name) | |
// 関数は可変引数を取ることが出来る。可変引数は配列になる | |
func squareSum(numbers: Int...) -> Int { // 二乗和 | |
var sum = 0 | |
// 関数は入れ子に出来る(関数中のコードが長いあるいは複雑な場合に利用する) | |
// - 入れ子になった関数は、外側の関数で宣言された変数にアクセスできる | |
func addSquare(x:Int) { sum += x * x } | |
for number in numbers { | |
addSquare(number) | |
} | |
return sum | |
} | |
squareSum(4, 6, 8, 9) | |
/** | |
* -------------- | |
* クロージャー | |
* -------------- | |
*/ | |
// クロージャーは、一連の処理の塊をオブジェクトとして扱えるようにしたものである | |
// 他の言語では、関数ポインターとかラムダとかと似たようなものである | |
var numbers = [4, 6, 8, 9] | |
// 名前なしクロージャーは、コードを{}で囲うことで書ける | |
// 戻り値と本体を分けるためにinを使う | |
numbers.map({ | |
(x: Int) -> Int in | |
return x * x | |
}) | |
numbers.map({ number in 3 * number }) | |
//sort([1, 5, 3, 12, 2]) { $0 > $1 } | |
/** | |
* ----------------------------- | |
* 標準ライブラリを使いこなす | |
* ----------------------------- | |
*/ | |
// Swift標準ライブラリリファレンス(Swift Standard Library Reference) | |
//https://developer.apple.com/library/prerelease/iOS/documentation/General/Reference/SwiftStandardLibraryReference/index.html | |
// - 型:String、Array、Dictionary、数値型 | |
// - プロトコル:Equatable、Comparable、Printable | |
// - Free Function:Printing(printとprintln)、Algorithm(sort) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment