>100 Views
May 20, 16
スライド概要
Swift を知ったつもりになっている今、その基本的なところを振り返ってみたら何か見えるものがあるかもしれない。そう思って 2014 年の MSM 2014 で使った資料を使って Swift 好きなみんなと談笑してみることにしました。この資料は MOSA MSM2014 のために用意した資料のうちの、発表用資料の抜粋です。
※ Docswell での公開に移行する直前の Slideshare での閲覧数は 1,432 でした。
正統派趣味人プログラマー。プログラミングとは幼馴染です。
Swift カジュアルプログラミング 2014年からSwiftを振り返る! 2016.04.23 カジュアル Swift 勉強会 #7 EZ-NET 熊⾕友宏 http://ez-net.jp/
۽୩༑ !FT@LVNBHBJ EZ-NETIUUQF[OFUKQ ॻ੶ొஃ 9DPEFపఈղઆ .04" 9DPEFͷશػೳΛ పఈతʹղઆͨ͠ຊ 049J04ܥͷྺ࢙ਂ͍ ༗ྉձһ੍ͷษڧձ 9DPEFͰཱͭͣ ๏ਓձһଟ ࢴ൛ઈ൛ɺిࢠॻ੶ൢചத ॳ৺ऀ͚ηϛφʔͰొஃ
۽୩༑ !FT@LVNBHBJ EZ-NETIUUQF[OFUKQ ษڧձ ԣ iPhone ։ൃऀษڧձ ΧδϡΞϧ Swift ษڧձ ʲԣɾഅंಓʳ ZJEFW ʲԣɾ੨༿ʳ DTXJGU Θ͍Θ͍ɾΏΔ͘ɺJ1IPOF։ൃऀͷ ΈΜͳͰָ͘͠ա͢͝ͷ͕తͷձ ΏΔ͘ΈΜͳͰ4XJGUΛޠΒ͑ΔΛ ࡞Γͨͯ࢝͘Ίͨձ ୈ̎̏ճΛʹ։࠵༧ఆ
۽୩༑ !FT@LVNBHBJ EZ-NETIUUQF[OFUKQ J04 049 "QQMF8BUDIΞϓϦ $PEF1JFDF ͍ͭͷి ιʔείʔυΛ5XJUUFSͱ (JTUʹಉ࣌ߘͰ͖Δɻ ࣜࢉܭ͑ݟΔిΞϓϦɻ XBUDI04ରԠ ԻͰ࠶ୡΰου &;/&5*11IPOF ؆୯ૢ࡞Ͱ ࠶ୡͷਃ͠ࠐΈɻ J1IPOFͰͻ͔ΓిΛ͏ɻ ࣗ-"/͔Βͷར༻ઐ༻
$PEF1JFDFGPS049 ษڧձΛָ͠ΉΞϓϦ ιʔείʔυΛ5XJUUFSͱ(JTUʹಉ࣌ߘͰ͖Δ ษڧձͰݟΛΈΜͳͱڞ༗͍ͨ࣌͠ͱ͔ʹศརʂ Ͱ͖Δ͜ͱ DTXJGU
2014 年 11 ⽉ 1 ⽇
2014 年 11 ⽉ 1 ⽇ MOSA Software Meeting 2014
MSM 2014 当時の資料で 今の Swift を振り返ってみよう!
当時の資料
ϕʔγοΫτϥοΫ 4XJGUͬͯͲΜͳ ϓϩάϥϛϯάͳޠݴͷʁ !.04"4PGUXBSF.FFUJOH &;/&5۽୩༑ IUUQF[OFUKQ
࢝ΊΔલʹ
1 .4.ࢿྉ 4XJGUͱ0CKFDUJWF$ͷߏจରরද w ηογϣϯͰ ༻͠·ͤΜɻ w 4XJGUΛ͡Ίͨͱ͖ͷ ॿ͚ʹͳΕ͍Ͱ͢ɻ
ඪ 4XJGUΛָͬͯ͘͠΄͍͠ ର ৽ޠݴ4XJGUʹؔ৺Λ͍ͯͤدΔํ
4XJGUͬͯͲΜͳޠݴʁ ʕ4XJGUޠݴΛָͬͯ͠ΉͨΊʹʕ
4XJGU֓ཁ
৽ޠݴ4XJGUొ !88%$
ಛ 'BTU ಈతޠݴΒ͠͞Λͳͯ͘͠ߴԽ .PEFSO ͠Έ͍͢ޠݴઃܭ 4BGF ෆଌͷࣄଶΛট͔ͳ͍ޠݴઃܭ *OUFSBDUJWF ίϯύΠϧ͋ͰޠݴΓͳ͕Βଈ࣮࣌ߦ͕Մೳ
ίϯηϓτ 0CKFDUJWF$ XJUIPVUUIF$ ʕ$ߏޠݴ͔Βͷ݃ผʕ
৽͍֓͠೦ $MPTVSFT ؔΛॊೈʹѻ͏ 5ZQFJOGFSFODF ܕਪͰޮྑ͘ίʔσΟϯά 79 4 .VMUJQMFSFUVSOUZQFT ΓͰෳͷΛฦͤΔ (FOFSJDT ʹܕറΒΕͳ͍࣮ /BNFTQBDFT Ϟδϡʔϧ୯ҐͰͷ໊લۭؒ 122
ޓੑ *OUFSPQFSBCJMJUZ 4XJGUΫϥεΛ0CKFDUJWF$͔Β༻ $PDPB"1*Λ4XJGUίʔυ͔Βར༻ .JYBOE.BUDI 0CKFDUJWF$ϑΝΠϧͱ4XJGUϑΝΠϧΛ ͻͱͭͷϓϩδΣΫτʹࠞࡏͯ͠ซ༻ .JHSBUJPO طଘͷ0CKFDUJWF$ίʔυΛ4XJGU͔Β 4XJGUΒ͍͠ߏจͰར༻
0CKFDUJWF$ʹऔͬͯมΘΔʁ
ͦΕະͷੈք ⚫︎ ·ͩ࢈·Εͯؒͳ͍ޠݴ ⚫︎ ϦϦʔεલ·ͰཔΓͳ͔ͬͨ ⚫︎ "QQMFͷҙࠐؾΈ͡ײΔ ⚫︎ ͍Α͍Α͖͍ͨͯͮؾ׆ҹ 4XJGU͔Β0CKFDUJWF$੍͕͋ͬͯɺ ٯࣗ༝ͳҹɺऔͬͯΘΔՄೳੑ͋Δʁ
औͬͯΘΔ͔ΑΓ ·ͣ4XJGUΛָ͠Έ·͠ΐ͏ʂ
4XJGUৄࡉ
4XJGUͷಛ
4XJGUͷಛ 'BTU ⚫︎ 0CKFDUJWF$ΑΓ͍Β͍͠ ެࣜൃදͰʜιʔτͰYߴʁ ⚫︎ ͷ伴ϝιουͼݺग़͠ʁ 0CKFDUJWF$ηϨΫλʹΑΔಈతղܾ 4XJGUԾؔςʔϒϧ WUBCMF ʁ ⚫︎ Λੜ͔ͤΔͷݶఆత͔ʁ ७4XJGUʹಈతղܾ͕ͳ͍༷ࢠ ࠓ0CKFDUJWF$ޓΫϥε͕ओྲྀ
4XJGUͷಛ .PEFSO 0CKFDUJWF$ NSArray *array = @[ @"A", @"B", @"C" ]; NSString *string = [array componentsJoinedByString:@", "]; NSLog(@"Value: %@", string); 4XJGU let array = [ "A", "B", "C" ] let string = join(", ", array) println("Value: \(string)")
4XJGUͷಛ 4BGF ෆଌΛੜ·ͳ͍ίʔυ͕ॻ͚Δ 㲈ෆଌΛ͍ͳ·ؚίʔυΛڧཁ͞ΕΔ ⚫︎ OJMΛऔΔ͔൱͔ͷ໌͕ࣔৗʹඞཁʂ 8 ⚫︎ ҟͳΔܕಉ࢜ͷԋࢉཁมʂ 10 ⚫︎ TXJUDIจͰશέʔεͷཏඞਢʂ 44 ⚫︎ ྫ֎ͰܥΤϥʔॲཧΛҕͶΒΕͳ͍ʂ ʕͦΕΛࢧԉ͢ΔͨΊͷػೳ͕ॆ࣮ʕ
4XJGUͷಛ *OUFSBDUJWF Ϗϧυૢ࡞ෆཁͰίʔυΛ࣮ߦՄೳ ⚫︎ ⚫︎ 9DPEF͔Βͷஞ࣮࣍ߦ 1MBZHSPVOE λʔϛφϧ͔Βͷஞ࣮࣍ߦ YDSVOTXJGU 1
0CKFDUJWF$ XJUIPVUUIF$
0CKFDUJWF$XJUIPVUUIF$ ߦจࣈ͔Βͷ݃ผ ߦͷηϛίϩϯΛলུՄೳʹ 0CKFDUJWF$ i += 10; 4XJGU i += 10
0CKFDUJWF$XJUIPVUUIF$ ݅จͷ͔ހׅΒͷ݃ผ ධՁࣜͷ֎ଆ͕ހׅলུՄೳʹ 0CKFDUJWF$ if (i == 10) { } 4XJGU if i == 10 { }
0CKFDUJWF$XJUIPVUUIF$ ඇΦϒδΣΫτ͔ܕΒͷ݃ผ ͯ͢ͷܕͷରͳѻ͍͕Մೳʹ ⚫︎ શͯͷ͕ܕΦϒδΣΫτ ⚫︎ *OUFOVNϝιουΛ࣋ͯΔ ⚫︎ ؔΦϒδΣΫτͱͯ͠ѻ͑Δ
0CKFDUJWF$XJUIPVUUIF$ $Ϧςϥϧ͔Βͷ݃ผ $ϦςϥϧΛ͢ʹؾΔඞཁ͕ͳ͘ͳͬͨ 0CKFDUJWF$ NSString *str = @"OBJC STRING"; NSNumber *num = @10; char* str = "C STRING"; int num = 10; 4XJGU let str:String = "SWIFT STRING" let num:Int = 10 17
0CKFDUJWF$XJUIPVUUIF$
24
Ϧςϥϧදݱͷ؆ૉԽ
ΦϒδΣΫτΛҙຯ͢Δ!ͷఫഇ
0CKFDUJWF$
NSArray *arr = @[ @5, @10 ];
NSDictionary *dic = @{ @"K1":@1, @"K2":@2 };
4XJGU
let arr:[Int] = [ 5, 10 ]
let dic:[String:Int] = [ "K1": 1, "K2": 2 ]
34
0CKFDUJWF$XJUIPVUUIF$ มͱఆͷ৽ ఆͷೖΕͱมͷೖΕ 0CKFDUJWF$ NSInteger i = 10; const NSInteger i = 10; NSString* s = @"TEXT"; NSMutableString* s = [@"TEXT" mutableCopy]; 4XJGU var i = 10 let i = 10 let s = "TEXT" var s = "TEXT" 3
0CKFDUJWF$XJUIPVUUIF$ จࣈྻϦςϥϧͷ֦ுʢల։ʣ ϦςϥϧͰμΠϨΫτʹॲཧΛల։Մೳ 0CKFDUJWF$ NSString *str = [NSString stringWithFormat:@"Name=%@, Value=%d", name, value]; 4XJGU let str:String = "Name=\(name), Value=\(value)" 20
0CKFDUJWF$XJUIPVUUIF$ จࣈྻϦςϥϧͷ֦ுʢ࿈݁ʣ ՃࢉԋࢉࢠͰจࣈྻΛ࿈݁Մೳʹ 0CKFDUJWF$ NSString *str = [@"MSM" stringByAppendingString:@"2014"]; 4XJGU let str:String = "MSM" + "2014" 18
0CKFDUJWF$XJUIPVUUIF$ 19 จࣈྻϦςϥϧͷ֦ுʢൺֱʣ ՁԋࢉࢠʹΑΔจࣈྻൺֱ͕Մೳʹ 0CKFDUJWF$ if ([string1 isEqualToString:string2]) { } 4XJGU if string1 == string2 { } 3
0CKFDUJWF$XJUIPVUUIF$ 72 ໊લ͖Ҿ ؔϝιουͷҾʹ໊લΛ໌ࣔͰ͖Δ 0CKFDUJWF$ [MyClass methodWithValue:10.0 ofType:@"$"] 4XJGU MyClass.method(value:10.0, ofType:"$") 90
0CKFDUJWF$XJUIPVUUIF$ 8 41 50 ৽͍͠σʔλܕ ͕͠ΒΈͷͳ͍εϚʔτͳॻࣜʹ 4XJGU // タプル…複数の型を自由に組み合わせられる let value:(Int,String) = (200, "SWIFT") 4 // nil 許容型…値の他に「ない」状態を扱える let value:Int? = nil 5 // 値つき列挙型…自由な値を持てる列挙子 enum Enumerate { case Name(String) case NoName }
OJMڐ༰ؔ͢ʹܕΔηογϣϯʜ ϕʔγοΫτϥοΫ ʙʜߴڮ໌͞· ʰ4XJGUΛࢧ͑ΔPQUJPOBMͷഎܠʱ
0CKFDUJWF$XJUIPVUUIF$ 44 62 63 64 65 66 67 TXJUDIߏจͷେ෯ͳ֦ு ϦςϥϧҎ֎Ͱ͕ذՄೳʹ ⚫︎ มʹ֨ೲͨ͠Λͬͨذ ⚫︎ ൣғʹΑΔذ ⚫︎ จࣈྻʹΑΔذ ⚫︎ λϓϧͷʹԠͨ͡ذ ⚫︎ ͖ͭྻܕڍͷʹԠͨ͡ذ 6 ʕߴͳᝲ͍͚Λ໌ྎʹࡌهՄೳʕ
0CKFDUJWF$XJUIPVUUIF$ ΄͔ʹ͍Ζ͍Ζʜ ⚫︎ ϔομʔϑΝΠϧෆཁ ⚫︎ ಉ໊͡લͰҟͳΔҾͷؔ ⚫︎ Ҿͷطఆ ⚫︎ ̔ਐɺ̎ਐϦςϥϧ
0CKFDUJWF$XJUIPVUUIF$ $ޠݴͷ͕͠ΒΈΛࣺͯΔ͜ͱͰ ػޠݴೳΛେ෯ʹ্
4XJGUͷ ৽͍֓͠೦
4XJGUͷ৽͍֓͠೦
79
$MPTVSF
ଈ੮ؔΛγϯϓϧʹ࡞ͬͯ͑Δ
4XJGU
// クロージャの定義
let isOK:(Int)->Bool = {(code:Int)->Bool in
return contains(200..<300, code)
}
// 関数のように実行
let result = isOK(200)
// 別の関数の引数に渡して実行
let result = contains(statuses, isOK)
7
4XJGUͷ৽͍֓͠೦ 5ZQFJOGFSFODF ঢ়͔گΒ໌͕ܕΒ͔ͳ߹ʹهड़ෆཁʹ ⚫︎ ॳظΛ͏มఆͷએݴ 4 6 ⚫︎ ίϨΫγϣϯ͔ΒཁૉΛॱ࣍औಘ 31 40 ⚫︎ ྻܕڍΛѻ͏͜ͱ͕໌֬ͳ߹ 43 44 ⚫︎ ੍ߏޚจͰMFUͰͷରԠΛऔΔ 13 65 ⚫︎ ΫϩʔδϟͷΓҾ 81 8
4XJGUͷ৽͍֓͠೦
.VMUJQMFSFUVSOUZQFT
ΓͰෳͷΛฦͤΔ
4XJGU
func getStatus()->(code:Int, status:String) {
return (200, "OK")
}
4XJGU
enum Status {
case OK
case Failed(String)
}
func getStatus()->Status {
return Status.OK
}
50
67
4XJGUͷ৽͍֓͠೦
122
(FOFSJDT
ʹܕറΒΕͳ͍࣮
⚫︎
ҙͷܕΛѻ͑ΔΦϒδΣΫτ
⚫︎
ίʔυͷڞ௨Խɾ࣮ͷޮԽ
⚫︎
ද͖ͰݱΔ͜ͱ͕ଟํ໘ʹ͕Δ
⚫︎
қͷߴ͍ػೳ
4XJGU
func add<T:IntegerArithmeticType>(v1:T, v2:T)->T {
return value1 + value2
}
9
4XJGUͷ৽͍֓͠೦ /BNFTQBDFT Ϟδϡʔϧ୯ҐͰͷ໊લۭؒ ⚫︎ ϑϨʔϜϫʔΫ୯ҐͰϞδϡʔϧΛ ⚫︎ ಉ໊͡લͷΦϒδΣΫτΛ۠ผՄೳ 4XJGU import MyModule1 import MyModule2 let obj1 = MyModule1.MyClass() let obj2 = MyModule2.MyClass()
4XJGUͱ0CKFDUJWF$ͷ ޓੑ
4XJGUͱ0CKFDUJWF$ͷޓੑ *OUFSPQFSBCJMJUZ 0CKFDUJWF$ͱ4XJGUͷ૬ޓӡ༻
4XJGUͱ0CKFDUJWF$ͷޓੑ *OUFSPQFSBCJMJUZ 4XJGUΫϥεΛ0CKFDUJWF$Ͱ༻Մೳ ⚫︎ /40CKFDUͷܧঝ·ͨ!PCKDଐੑ͕ඞਢ ⚫︎ ϝιου໊͕0CKFDUJWF$తʹࣗಈௐ ⚫︎ ⚫︎ !PCKDΫϥεͰΠϯελϯεΛฦͨ͢Ίͷ Ϋϥεϝιουͷ࣮͕ඞཁ 0CKFDUJWF$ʹͳ͍ػೳΛͬͨͷෆՄ ྻ ܕڍΦʔόʔϩʔυ (FOFSJDT ʜ
4XJGUͱ0CKFDUJWF$ͷޓੑ *OUFSPQFSBCJMJUZ 4XJGUΫϥεΛ0CKFDUJWF$Ͱ༻Մೳ 4XJGU class MyClass : NSObject { var value:Int init(value:Int) } 0CKFDUJWF$ MyClass* obj = [[MyClass alloc] initWithValue:10]; obj.value; ʕJNQPSU130+/".&4XJGUIͰར༻Մೳʹʕ
4XJGUͱ0CKFDUJWF$ͷޓੑ *OUFSPQFSBCJMJUZ $PDPB"1*Λ4XJGU͔Βར༻Մೳ ⚫︎ ΄΅શͯΛ4XJGUΒ͍͠ίʔυͰར༻Մೳ ⚫︎ ར༻Ͱ͖ͳ͍ͷ͋Δ 4XJGU let value:NSString = "TEST STRING" value.stringByReplacingOccurrencesOfString("TEST", withString: "SWIFT", options: NSStringCompareOptions.LiteralSearch, range: NSMakeRange(0, value.length)) ʕJNQPSU'PVOEBUJPOͰར༻Մೳʹʕ
4XJGUͱ0CKFDUJWF$ͷޓੑ .JYBOE.BUDI 0CKFDUJWF$ͱ4XJGUͱΛࠞࡏ
4XJGUͱ0CKFDUJWF$ͷޓੑ .JYBOE.BUDI 0CKFDUJWF$ϑΝΠϧͱ4XJGUϑΝΠϧΛࠞࡏ
4XJGUͱ0CKFDUJWF$ͷޓੑ .JHSBUJPO طଘͷ0CKFDUJWF$Λ4XJGUͰ༻׆
4XJGUͱ0CKFDUJWF$ͷޓੑ .JHSBUJPO ࣗ࡞0CKFDUJWF$ΫϥεΛ4XJGUͰ༻ ⚫︎ ⚫︎ ⚫︎ ϓϩδΣΫτͷ#VJME4FUUJOHTͰ 0CKFDUJWF$#SJEHJOH)FBEFSΛొ ͦ͜4XJGUͰ͍͍ͨϔομʔϑΝΠϧΛ JNQPSU͢Δͱ4XJGUͰར༻ՄೳʹͳΔ $ 0CKFDUJWF$ ϔομʔʹ$ ίʔυར༻ෆՄ ݻ༗ͷػೳ͑͞ͳ͚Ε0, ʕ4XJGUଆͰJNQPSU͢Δඞཁͳ͘ར༻Մೳʕ
4XJGUͱ0CKFDUJWF$ͷޓੑ .JHSBUJPO ࣗ࡞0CKFDUJWF$ΫϥεΛ4XJGUͰ༻ 0CKFDUJWF$ @interface MyClass : NSObject @property (readwrite) NSInteger value; - (instancetype)initWithValue:(NSInteger)value; @end 4XJGU let obj = MyClass(value:10) obj.value
4XJGUͱ0CKFDUJWF$ͷޓੑ 0CKFDUJWF$ͱ4XJGUͷ ૬ޓΓೖΕ͕ඇৗʹ͍͢͠ ʕখ͍͞୯ҐͰͷ4XJGUͷҠߦ͕Մೳʕ
0CKFDUJWF$ͱ4XJGUͷ ૬ޓӡ༻ʹؔ͢Δηογϣϯʜ ϕʔγοΫτϥοΫ ʙʜத༸Ұ͞· ʰ4XJGU࣮ફฤ0CKFDUJWF$͔Βͷ Ҡߦͱίʔυͷڞଘ 9DPEFͷ৽ػೳհʱ
4XJGU͍ͬͯ͠ʁ
伴ΛѲΔͱ͜Ζ 0QUJPOBMͱ$POWFSUJCMF ͘͠͡ײΔͷ͚͔ͩ͜͜ʁ (FOFSJDTͱ1SPUPDPMT 4XJGUʹޠݴະདྷΛ͡ײΔͱ͜Ζʂ
4XJGUΛָ͠Έ·͠ΐ͏ʂ