Swiftの簡単な説明
アップルのiOS(iOS8以降)およびOS Xのためのプログラミング言語。Worldwide Developers Conference (WWDC) 2014で発表された。
アップル製OS上で動作するアプリケーションの開発に従来から用いられていた言語であるObjective-CやC言語と共存することを大きなコンセプト
とはしていますが、無意味に括弧が多く、仕様の追加と互換性の担保のために、言語として分かりにくくなってしまったObjective-Cに
取って代わる言語として期待されています。
Objective-CとSwiftの相互呼び出しのイメージは以下のようになります。
結局、両者を自由に呼び出せるって事が言いたいだけなのですが・・・
では、今後のiOSアプリケーションの開発者はSwiftだけを知っていれば良いかと言うとそうはいきません。
サードパーティの既存のライブラリがSwiftにすぐに完全対応することは不可能でしょうし、
.Net FrameworkのマネージドコードがSwiftで、アンマネージドコードがObjective-Cの関係に相当すると言え、
Swiftは、変なコンパイル処理によって無駄な処理が追加される可能性があるので、えーーい、そう来るならObjective-Cで書きなおしちゃえ
って事が発生する可能性は結構あると個人的には思っています。
まあ、SwiftコンパイラがこなれてくるとほぼSwiftオンリーになる時も来るかもしれません。
Swiftの超早入門
まずは、Swiftの基本的なところの各概要を簡単に説明させていただきます。
詳細な説明は別エントリーを数回に分けて作成する予定です。
利用している環境は「Xcode 6 GM seed」となります。
宣言と基本データ型
変数宣言
var 変数名 = 変数リテラル
もしくは
var 変数名: 変数の型 = 変数リテラル
で行えます。
定数宣言
変数宣言のvarをletに変えるだけで定数宣言を行えます。
基本データ型
Swiftの代表的な基本データ型には、Int(整数型)、Double(浮動小数点数型)、String(文字列型)、
Character(文字型)、Bool(真偽型)があります。
他の一般的な言語と同様にSwiftの変数と定数には、値型(Value Type)と参照型(Reference Type)の2種類があり、
前者は値代入の際には値自体がコピーされるのに対し、後者は値代入の際にはオブジェクトへの参照のポインター(アドレス)がコピーされます。
ここで注目なのがStringが値型であることです。JavaやC#では参照型となっていますので、この点は留意しておく必要があります。
宣言と基本データ型のサンプルコード
・基本となる変数と定数の宣言例
変数のintValue1、intValue2と定数のdoubleValue1、doubleValue2を定義しています。
1 2 3 4 5 6 7 8 9 10 11 |
//変数の宣言例 //intValue1は型を明示しないがIntで初期化されるのでInt型 var intValue1 = 10 //intValue2は宣言時にInt型と宣言 var intValue2: Int = 10 //定数の宣言例 //doubleValue1は型を明示しないがDoubleで初期化されるのでDouble型 let doubleValue1 = 3.14 //doubleValue2は宣言時にDouble型と宣言 let doubleValue2: Double = 3.14 |
・定数の値を変更してみる
次にdoubleValue2の値を変更する処理を追加してみます。すると当たり前ですがコンパイルエラーとなりました。
スクリーンショットでは見にくいですがCannot assign to ‘let’ value ‘doubleValue2’とのエラーメッセージとなっています。
・異なる型の変数の代入
Double型とString型の変数を宣言し、異なる型の変数の代入時の動きを確認してみました。
1 2 3 4 5 6 7 8 9 10 11 |
//暗黙の型変換の確認用の変数 var doubleValue3 = 10.10 var stringValue = "文字列の変数です。" //Compiler Error 'Int' is not convertible to 'String' stringValue = intValue1 //Compiler Error 'Double' is not convertible to 'String' stringValue = doubleValue2 //Compiler Error 'Double' is not convertible to 'Int' intValue2 = doubleValue2 //Javaなら暗黙の型変換でエラーにならない Compiler Error 'Int' is not convertible to 'Double' doubleValue3 = intValue2 |
5行目と7行目は予想通りコンパイルエラーとなりました。
9行目はIntにDoubleを代入するのも当然コンパイルエラーとなりました。
問題は11行目です。DoubleにIntを代入する時には暗黙の型変換されるのが普通(少なくともJavaはそう)
なのですが、コンパイルエラーとなります。
これが数値型におけるSwiftの仕様の注意点です。
いかなる数値型の変数についても暗黙の型変換(cast)が行われることはなく、型の違う数値同士の演算では、
右辺と左辺で型の異なる代入は全てコンパイルエラーとなります。
・異なる型のリテラルの代入
変数同士の代入は予想通りでしたが、リテラルの代入はどうでしょうか?
1 2 3 4 5 6 7 8 9 10 |
//暗黙の型変換の確認用の変数 var doubleValue3 = 10.10 var stringValue = "文字列の変数です。" //Compiler Error Type 'String' does not conform to protocol 'IntegerLiteralConvertible' stringValue = 100 //Compiler Error Type 'String' does not conform to protocol 'IntegerLiteralConvertible' stringValue = 100 //数値型のリテラルは暗黙の変換がOKな代入はOK、intValue2は3がセットされる。 intValue2 = 3.14 doubleValue3 = 999 |
Stringに数値型を代入できないのは理解できますが、エラーメッセージはイマイチですね・・・
数値型への代入に関しては右辺がリテラルだけの場合は暗黙の型変換が行われます。
右辺にも変数が絡んでくる場合は暗黙の型変換は行われないので注意が必要です。
(右辺が四則演算になっている場合)
コレクション型
Array
基本的にObjective-CのNSMutableArrayクラスに相当の型と考えていただいて問題ないですが、
ジェネリクス対応がなされています。Javaのジェネリクス対応のリストと同じですね。
・Arrayの宣言方法
Stringの要素で構成される配列:Arrayの宣言方法は以下のようになります。
var Arrayの変数名 = [“要素の値1”, “要素の値2”, “要素の値3”]
また他の変数と同様に型を明示して宣言することも可能です。以下の例だとStringを要素とするArrayと指定しています。
var Arrayの変数名: Array = [“要素の値1”, “要素の値2”, “要素の値3”, “要素の値4”]
これ以降はXCTestのテストメソッドで各種動きの説明を行います。
・要素取得、参照
Arrayの変数名[i]でi番目の要素が参照可能です。
またArrayの変数名[i…j]でi番目からj番目の要素を持つ部分配列に相当する物が取得可能です。
2014年11月25日修正と言っても実際にはこの時取得できるオブジェクトはSliceという物でArrayではありまん。Arrayとして取得するにはArray(変数名[i…j])と記述する必要があります。
ここまでをテストメソッドで確認してみます。
2014年11月25日修正Swiftの仕様変更によりSliceオブジェクトとArrayを直接比較できなったため、SliceからArrayを作成して比較するように修正
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
func testArray() { //Arrayの宣言 var Arrayの変数名 = ["要素の値1", "要素の値2", "要素の値3", "要素の値4"] //Array<String>の型を明示的に指定してもOK var Arrayの変数名2: Array<String> = ["要素の値1", "要素の値2", "要素の値3", "要素の値4"] //同じ要素、同じ順番のArrayは一致 XCTAssertEqual(Arrayの変数名, ["要素の値1", "要素の値2", "要素の値3", "要素の値4"]); //同じ要素、異なる順番のArrayは不一致 XCTAssertNotEqual(Arrayの変数名, ["要素の値3", "要素の値2", "要素の値1", "要素の値4"]); //0番目の要素の参照方法 XCTAssertEqual(Arrayの変数名[0], "要素の値1"); //i番目からj番目の要素までを取り出すにはArrayの変数名[i...j] //SliceとArrayの比較の仕様変更対応 Arrayの変数名[0...3]は結果的に全部 XCTAssertEqual(Array(Arrayの変数名[0...3]), ["要素の値1", "要素の値2", "要素の値3", "要素の値4"]) //SliceとArrayの比較の仕様変更対応 Arrayの変数名[2...3]は["要素の値3", "要素の値4"]を返却 XCTAssertEqual(Array(Arrayの変数名[2...3]), ["要素の値3", "要素の値4"]) } |
予想通りテストは成功しました。
・要素の追加、更新、削除
この処理のポイントはArrayにArrayを追加できる。Arrayの任意の部分を指定Arrayで更新できることぐらいです。
他の処理は他の言語と同じ考え方でOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
func testChangeArray() { //Arrayの宣言、Array<String>を明示的に指定 var Arrayの変数名: Array<String> = [] //要素の追加 //appendでArrayの最後に追加 Arrayの変数名.append("追加要素1") //+でArrayの最後にArrayを追加 Arrayの変数名 += ["追加要素2", "追加要素3"] //index指定で要素を追加 Arrayの変数名.insert("追加要素4", atIndex: 3) //要素の追加後の確認 XCTAssertEqual(Arrayの変数名, ["追加要素1", "追加要素2", "追加要素3", "追加要素4"]); //要素の更新 Arrayの変数名[3] = "追加要素4を変更" Arrayの変数名[1...2] = ["配列指定で変更2", "配列指定で変更3"] //要素の追加後の確認 XCTAssertEqual(Arrayの変数名, ["追加要素1", "配列指定で変更2", "配列指定で変更3", "追加要素4を変更"]); //要素の削除 //インデックス指定で削除 Arrayの変数名.removeAtIndex(1) XCTAssertEqual(Arrayの変数名, ["追加要素1", "配列指定で変更3", "追加要素4を変更"]); //removeAllでkeepCapacityにtrueを指定して全要素を削除 Arrayの変数名.removeAll(keepCapacity: true) //keepCapacity: trueは配列が確保している要素数分のメモリー空間を解放しないだけでcountは0になる XCTAssertEqual(Arrayの変数名.count, 0); } |
Dictionary
基本的にObjective-CのNSMutableDictionaryクラスに相当の型と考えていただいて問題ないですが、
ジェネリクス対応がなされています。Javaのジェネリクス対応のHashMapと同じですね。
・Dictionaryの宣言方法
まずは宣言方法ですが、Arrayと同様にジェネリクスを利用して明示的な型指定をすることもできますし、
右辺の値で暗黙的に解決させることもできます。
1 2 3 4 5 6 7 |
func testDictionary() { //Dictionaryの宣言、キー:Int、バリュー:Stringと暗黙で宣言 //var dic1: Dictionary<Int, String> = ["1":"1の値", "2":"2の値"]と同じ var dic1 = [1:"1の値", 2:"2の値"] //Dictionaryの宣言、キー:String、バリュー:Stringと明示的に型を指定 var dic2: Dictionary<String, String> = ["1":"1の値", "2":"2の値"] } |
・Optional型
Dictionaryの話題とは直接関係ないのですがSwiftにはOptional型という物があります。
Dictionaryのキーに対する値を取得した場合は必ずこのOptional型になります。
理由は不明ですが、キーがDictionaryに存在するかどうかに関わらず同じ処理にして欲しいのでしょうか・・・
結局はnilじゃなかったらって判定がどこかで入るので意味ないような気がしますが・・・
Swiftの変数にはnilを代入することはできません。nilを代入できるようにするためにOptional型を利用します。
Optional型にする場合は、変数宣言時の型の後ろに?を付与します。
またOptionalのT:テンプレートに宣言したい型(IntやString等)を指定した型として宣言することでも可能です。
Optional型の宣言例
normalIntはOptional型ではないのでnilを代入できません(コンパイルエラー)
wrapInt1とwrapInt2はIntのOptional型として宣言していますのでnilを代入できます。
1 2 3 4 5 6 7 8 9 |
func testOptional() { //普通のInt型の変数にはnilを代入できない //Compile Error Cannot convert the expression's type 'UnsafeMutablePointer' to type 'NilLiteralConvertible' var normalInt = nil //型指定の所で?を付けるとOptional型でwrap(ラップ)することになりnil許容変数になる var wrapInt1: Int? = nil //?を指定しなくてもOptionalのテンプレートにIntを指定しても同じ意味の宣言となる var wrapInt2: Optional<Int> = nil } |
wrapInt1とwrapInt2はOptional型でラップ(wrap)されていると表現します。
逆にOptional型からアンラップ(unwrap)するには!を変数名の後ろに付与します。
1 2 3 4 5 6 7 8 9 |
func testOptional() { //型指定の所で?を付けるとOptional型でwrap(ラップ)することになりnil許容変数になる var wrapInt1: Int? = nil //!でアンラップ var unwrapInt1 = wrapInt1! //Compile Error Cannot convert the expression's type 'UnsafeMutablePointer' to type 'NilLiteralConvertible' unwrapInt1 = nil } |
6行目の右辺はwrapInt1の後ろに!がついています。!が無ければ型の推定でunwrapInt1はwrapInt1と同じInt?となりますが、
!によってOptional型からアンラップされるのでunwrapInt1はIntと型が決まります。
アンラップする時の注意点はnilでないかのチェックを事前に行うことです。この例のままではランタイムエラーが発生します。
・要素取得、参照
Dictionaryの参照方法はDictionaryの変数名[キー]で行えます。
取得した値はOptional型となりますので非nilチェックは必須です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
func testDictionary() { //Dictionaryの宣言、キー:Int、バリュー:Stringと明示的に型を指定 var dic1: Dictionary<Int, String> = [1:"1の値", 2:"2の値"] //Dictionaryの参照方法はdic1[キー]で行う、下記の場合key1Valueには"1の値"が格納されるが //型はString?となる。 var key1Value: String? = dic1[1]! //アンラップする前に非nilチェック XCTAssertTrue(dic1[1] != nil) //XCTAssertEqualにはString?は指定できないのでkey1Valueをアンラップして比較 XCTAssertEqual(dic1[1]!, "1の値") } |
・要素の追加、更新、削除
この処理は全てDictionaryの変数名[キー]=
で値を代入することで行えます。
Dictionaryに指定したキーが存在しない場合は新規追加、存在する場合は値の更新、nilを代入すると指定したキーの削除となります。
更新はupdateValueメソッド、削除はremoveValueForKeyでも行えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
func testChangeDictionary() { //Dictionaryの宣言、キー:Int、バリュー:Stringと明示的に型を指定 var dic1: Dictionary<Int, String> = [1:"1の値", 2:"2の値", 4:"4の値"] //要素追加は更新と同じ、指定したキーの値が無い場合は追加、有る場合は更新 dic1[3] = "3の値(新規追加)" //要素追加は更新 dic1[1] = "1の値(更新)" //updateValueでも更新可能 dic1.updateValue("2の値(updateValue:forKey)", forKey:2) //この時点では[1:"1の値(更新)", 2:"2の値(updateValue:forKey)",3:"3の値(新規追加)", 4:"4の値"] XCTAssertEqual(dic1, [1:"1の値(更新)", 2:"2の値(updateValue:forKey)", 3:"3の値(新規追加)", 4:"4の値"]) //削除はnilを代入 dic1[4] = nil //removeValueForKeyでも削除可能 dic1.removeValueForKey(1) //この時点では[2:"2の値(updateValue:forKey)", 3:"3の値(新規追加)"] XCTAssertEqual(dic1, [2:"2の値(updateValue:forKey)", 3:"3の値(新規追加)"]) //removeAllで全削除 dic1.removeAll(keepCapacity: true) XCTAssertEqual(dic1.count, 0) } |
制御構文
if文、for文、switch文、while文等が利用できます。
基本的にはJavaとほぼ同じです。今回は概要ですのでサンプルコードのみとさせていただきます。
注意点としてはswitchの各case文が暗黙的にbreakされることです。
Java、C、C++、C#等は明示的にbreak命令を書かないとそのcase文以下の全てのcase文が実行されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
func test制御構文() { var sum = 0; for indexValue in 0...10 { //sumにindexValueを足す sum += indexValue //switch文の例、他の言語と異なり各case文は暗黙的にbreakされる switch indexValue { case 0: XCTAssertEqual(indexValue, 0) //暗黙的にbreakされる case 1: XCTAssertEqual(indexValue, 1) //暗黙的にbreakされる default: XCTAssertTrue(true) } } //sumは55のはず XCTAssertEqual(sum, 55) var whileCount = 0; //whileの例 while(sum > 0) { sum-- whileCount++ //if、else if、elseの例 if(sum < whileCount) { XCTAssertTrue(sum < whileCount) } else if(sum == whileCount) { XCTAssertEqual(sum, whileCount) } else { XCTAssertTrue(sum > whileCount) } } //whileCountは55のはず XCTAssertEqual(whileCount, 55) } |
メソッド定義
戻り値の有るメソッドの定義方法
戻り値の有るメソッドの定義方法は以下のようになります。
func メソッド名(引数名1: 引数名1の型, 引数名2: 引数名2の型) -> 戻り値の型 {}
またObjective-Cのように外部引数名を指定して呼び出してもらいたい場合は
func メソッド名(外部引数名1 引数名1: 引数名1の型, 外部引数名2 引数名2: 引数名2の型) -> 戻り値の型
のように各引数名の前に半角スペースをはさんで外部引数名を指定します。
(全ての引数に対して外部引数名を指定する必要はございません。)
実装サンプルは以下のようになります。
1 2 3 4 5 6 7 8 9 |
//2つのIntの引数を足した結果を返却するメソッド func funcReturnValueSample(value1: Int, value2: Int) -> Int { return value1 + value2 } func testFuncReturnValueSample() { //funcReturnValueSample(60, 200)が260か検証 XCTAssertEqual(funcReturnValueSample(60, 200), 260) } |
あれ!?、8行目でコンパイルエラーが発生しています。
エラーメッセージはMissing argument label ‘value2:’ in callとなっています。
value2には外部引数名を指定していないのでvalue2:は書かなくてもOKなはずですが、どこかで仕様変更があったのでしょうか?
testFuncReturnValueSampleを以下のように変更するとコンパイルもテストも成功しました。
1 2 3 4 |
func testFuncReturnValueSample() { //funcReturnValueSample(60, 200)が260か検証 XCTAssertEqual(funcReturnValueSample(60, value2: 200), 260) } |
戻り値の無いメソッドの定義方法
戻り値の無いメソッドの定義方法は以下のようになります。
func メソッド名(引数名1: 引数名1の型, 引数名2: 引数名2の型) {}
クラス
最後はクラスの定義方法です。
基底クラスを指定しないクラスの定義
クラスの定義方法は以下の通りです。
class クラス名 {
// 実装…
}
基底クラスを指定したクラスの定義
基底クラスを指定した場合のクラスの定義方法は以下の通りです。
class クラス名: 基底クラス {
// 実装…
}
今回は概要説明としていますので、インスタンスメンバを保持したクラスの定義例まで説明させていただきます。
まずは2つの変数と2つの定数を保持したクラスを定義します。
1 2 3 4 5 6 7 8 9 10 |
class SomeClass { //インスタンス変数は宣言時に初期化できる var value1 = 0 //インスタンス変数で宣言時に初期化しない場合は型を明示し、必ずinitメソッドで初期化する var value2: Int //インスタンス定数も変数と同じ let value3 = 0 let value4: Int } |
ソース内のコメントにも記載いますが、インスタンス変数、インスタンス定数の宣言時に初期値はセットする必要はないです。
当然セットしてもいいです。
上記のコードのみの場合はコンパイルエラーが発生します。
エラーメッセージはClass ‘SomeClass’ has no initializersとなっています。これはinit()が存在しないとのエラーです。
initializerは全てのクラスに必須な物ではありませんが、SomeClassは初期化されていない変数:value2と定数:value4
が存在しているため、initializerでそれぞれを初期化する必要があります。
空っぽのinit()を追加してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class SomeClass { //インスタンス変数は宣言時に初期化できる var value1 = 0 //インスタンス変数で宣言時に初期化しない場合は型を明示し、必ずinitメソッドで初期化する var value2: Int //インスタンス定数も変数と同じ let value3 = 0 let value4: Int init() { } } |
今度は
Property ‘self.value2’ not initializedとのエラーメッセージに変わりました。
value4も同じ扱いだと思うのですが・・・
value2とvalue4の初期化処理を追加したところコンパイルが成功しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class SomeClass { //インスタンス変数は宣言時に初期化できる var value1 = 0 //インスタンス変数で宣言時に初期化しない場合は型を明示し、必ずinitメソッドで初期化する var value2: Int //インスタンス定数も変数と同じ let value3 = 0 let value4: Int init() { value2 = 100 value4 = 300 } } |
なお、initializerはJavaのコンストラクタのように引数を指定することも可能です。
以下の例では引数にvalue1とvalue2を指定できるようになっています。
この場合value2は引数にもインスタンス変数にも存在するので、インスタンス変数のvalue2はself.value2と表現する必要があります。
1 2 3 4 |
init(value1: Int, value2: Int) { self.value2 = value1 self.value4 = value2 } |
最後にメソッドを追加し、そのメソッドを呼び出す処理を書いてみます。
と言ってもfuncReturnValueSampleメソッドをSomeClassにコピーして
SomeClassをインスタンス化しfuncReturnValueSampleメソッドを呼び出すようにするだけです。
SomeClassは以下のようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class SomeClass { //インスタンス変数は宣言時に初期化できる var value1 = 0 //インスタンス変数で宣言時に初期化しない場合は型を明示し、必ずinitメソッドで初期化する var value2: Int //インスタンス定数も変数と同じ let value3 = 0 let value4: Int init() { value2 = 100 value4 = 300 } //2つのIntの引数を足した結果を返却するメソッド func funcReturnValueSample(value1: Int, value2: Int) -> Int { return value1 + value2 } } |
SomeClassをインスタンス化しfuncReturnValueSampleメソッドの呼び出しは以下のようになります。
1 2 3 4 5 6 |
func testFuncReturnValueSample() { //SomeClassのインスタンス作成。init()がここから呼ばれる let someClass = SomeClass() //someClassのfuncReturnValueSample(60, 200)が260か検証 XCTAssertEqual(someClass.funcReturnValueSample(60, value2: 200), 260) } |
今回はSwiftの構成要素の必要最低限の説明のみとなっていますので、今後より詳細なエントリーを作成していく予定です。
「Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第一回「Swiftの概要」」は以上です。
Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」に続きます。
関連オススメ書籍
Googleアドセンス
Googleアドセンス
関連記事
-
-
Xcode6_Beta5&SwiftでUITableViewでUINibを使ったカスタムセル(UITableViewCell)を利用する方法
前回は、「Xcode5&Objective-CでUITableViewでUINibを使ったカ
-
-
iOS8開発者向けお勧め本紹介[詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応]
iOS7開発者向けお勧め本紹介を以前に紹介させていただきまいたが、今回は同じ著者(大重美幸様)の本を
-
-
Xcode6とSwiftで画面コンポーネント(UIコンポーネント)を配置して利用するための基本
当然ですが、iOS向けのアプリケーションを作成するためには、 画面に画面コンポーネント(UIコンポ
-
-
Swift(Xcode6-Beta2)でMagicalRecord関連の処理を含んだDAOクラスのユニットテスト(UnitTest:XCTestフレームワーク)を実装する時にハマった事
SwiftでMagicalRecord関連の処理を含んだDAOクラスを作成し、ユニットテスト(XCT
-
-
Xcode6-Beta2でSwiftのユニットテスト(Unit Test)をXCTestフレームワークで試してみる。
タイトルの通りですが、Xcode6-Beta2でSwiftのユニットテスト(XCTestフレームワー
-
-
Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」
前回はSwiftの概要をザックリと説明させていただきました。 今回は「メソッドの宣言方法」をよ
-
-
iOS(Xcode6とSwift)におけるマルチスレッド処理の実装方法その1[NSThreadクラスの簡単な利用例]
前回はObjective-CにおけるNSThreadクラスの簡単な利用例を取り扱いましたが今回は、ほ
-
-
Xcode6(Swift)のデリゲートとプロトコルの使い方
Xcode(Objective-C)のデリゲートの使い方では利用言語がObjective-Cの時のデ
-
-
Swift入門[公式リファレンスのチュートリアルのSteps2の後半]
「Swift入門」では、Steps2の前半まで説明させていただきました。 本エントリーでは、
-
-
Xcode6とSwiftでイメージ(画像)やアニメーションを表示する方法
本エントリーでは、Xcode6(言語はSwift)を利用してイメージ(画像)やアニメーションを表示す