
Yandex Mobile Campã®äžç°ãšããŠãååã®
Denis Lebedevãæ°ããSwiftããã°ã©ãã³ã°èšèªã«é¢ããã¬ããŒããçºè¡šããŸããã 圌ã®å ±åã§ã¯ã圌ã¯Objective-Cãšã®çžäºäœçšã®ç¹åŸŽã«è§Šããèšèªã®ç¹åŸŽã«ã€ããŠè©±ããŸããã ãŸããGithubã®ã©ãã«è¡ãã¹ãããå®éã®äžçã§Swiftã§äœãã§ããããç解ããããã«ã©ã®ãªããžããªãæ¢ãã¹ããã«ã€ããŠã説æããŸãã
Swiftéçºã¯2010幎ã«å§ãŸããŸããã ã¯ãªã¹ã»ã©ãããŒã¯ããã«åŸäºããŠããŸããã 2013幎ãŸã§ããã®ããã»ã¹ã¯ããŸã掻çºã§ã¯ãããŸããã§ããã åŸã
ã«ãŸããŸãå€ãã®äººã
ãé¢äžããããã«ãªããŸããã 2013幎ãAppleã¯ãã®èšèªã®éçºã«æ³šåããŸããã WWDCã§ã®ãã¬ãŒã³ããŒã·ã§ã³ã®åã«ãçŽ200人ãSwiftãç¥ã£ãŠããŸããã 圌ã«é¢ããæ
å ±ã¯æ¥µç§ã«ä¿ç®¡ãããŠããŸããã
Swiftã¯ãã«ããã©ãã€ã èšèªã§ãã OOPããããæ©èœçãªãã®ãè©Šãããšãã§ããŸãããé¢æ°åããã°ã©ãã³ã°ã®æ¯æè
ã¯ãSwiftã¯å°ãå Žéãã ãšä¿¡ããŠããŸãã ãããããã®ãããªç®æšã¯èšå®ãããŠããªãã£ãããã«èŠããŸãããããã¯æ°åŠè
ã®ããã§ã¯ãªãã人ã
ã®ããã®èšèªã§ãã æç¶ãåã®ã¹ã¿ã€ã«ã§èšè¿°ã§ããŸãããããããããžã§ã¯ãå
šäœã«åœãŠã¯ãŸããã©ããã¯ããããŸããã Swiftã§éåžžã«èå³æ·±ãã®ã¯ããã¹ãŠãé¡ååãããŠããããšã§ãã åçãªObjective-Cãšã¯ç°ãªããéçã§ãã åæšè«ããããŸãã ã€ãŸã ã»ãšãã©ã®å€æ°å宣èšã¯åçŽã«çç¥ã§ããŸãã ããŠãSwiftã®åªããæ©èœã¯ãObjective-Cãšã®éåžžã«æ·±ãçžäºäœçšãšèããããšãã§ããŸãã åŸã§ã©ã³ã¿ã€ã ã«ã€ããŠèª¬æããŸãããä»ã®ãšããã¯ãSwiftã®ã³ãŒããObjective-Cã§äœ¿çšã§ãããã®éãåæ§ã§ãããšããäºå®ã«éå®ããŸãã Swiftã®ãã¹ãŠã®Objective-Cããã³C ++éçºè
ã«ãªãã¿ã®ãããã€ã³ã¿ãŒã¯ãããŸããã
æ©èœã«ç§»ããŸãããã ãããããããŸãã ç§ã¯èªåã®ããã«ããã€ãã®éèŠãªãã®ãç¹å®ããŸããã
- åå空éã Objective-Cã®åé¡ã¯èª°ããç解ããŠããŸãã2æåãš3æåã®ã¯ã©ã¹ã®ãããååã®ç«¶åããã°ãã°çºçããŸãã Swiftã¯ãæçœã§ç解å¯èœãªåå空éãå°å
¥ããããšã«ããããã®åé¡ã解決ããŸãã åäœããŸãããããªãªãŒã¹ã®ããã«ã誰ããä¿®æ£ããå¿
èŠããããŸãã
- æ±çšã¯ã©ã¹ãšé¢æ°ã C ++ã§æžãã人ã«ãšã£ãŠã¯ãããã¯ããªãæçœãªããšã§ãããäž»ã«Objective-Cã«åºãããã人ã«ãšã£ãŠã¯ãããã¯ããªãèå³æ·±ãæ°æ©èœã§ããã䜿çšããã®ãé¢çœãã§ãããã
- ååä»ã/ããã©ã«ãã®ãã©ã¡ãŒã¿ãŒã ååä»ããã©ã¡ãŒã¿ãŒã䜿çšããŠãã人ã¯èª°ãé©ããªãã§ããã;ãããã¯æ¢ã«Objective-Cã«ãããŸããã ãã ããããã©ã«ãã®èšå®ã¯éåžžã«äŸ¿å©ã§ãã ã¡ãœããã5ã€ã®åŒæ°ãåãå
¥ãããã®ãã¡3ã€ãããã©ã«ãã§èšå®ãããŠããå Žåãé¢æ°åŒã³åºãã¯ã¯ããã«çããªããŸãã
- æ©èœã¯ãã¡ãŒã¹ãã¯ã©ã¹ã®åžæ°ã§ãã Swiftã®é¢æ°ã¯äžæ¬¡ãªããžã§ã¯ãã§ãã ããã¯ããããããã©ã¡ãŒã¿ãŒãšããŠä»ã®ã¡ãœããã«æž¡ãããä»ã®ã¡ãœããããè¿ãããããšãæå³ããŸãã
- ãªãã·ã§ã³ã®ã¿ã€ãã ãªãã·ã§ã³åã¯ãé¢æ°åããã°ã©ãã³ã°ããå°ãä¿®æ£ããã圢ã§ç§ãã¡ã«ããããããèå³æ·±ãæŠå¿µã§ãã
æåŸã®æ©èœãããã«è©³ããèããŠã¿ãŸãããã Objective-Cã§ã¯ãäœãè¿ãã®ãããããªãå Žåããªããžã§ã¯ãã«ã¯nilãè¿ããã¹ã«ã©ãŒã«ã¯-1ãŸãã¯NSNotFoundãè¿ããŸãã ãªãã·ã§ã³ã®ã¿ã€ãã¯ããã®åé¡ãæ ¹æ¬çã«è§£æ±ºããŸãã ãªãã·ã§ã³ã®ã¿ã€ãã¯ãå€ãå«ãããäœãå«ãŸãªãããã¯ã¹ãšèããããšãã§ããŸãã ãããŠãã©ã®ã¿ã€ãã§ãæ©èœããŸãã ãã®çœ²åããããšããŸãïŒ
(NSInteger) indexOfObjec: (id)object;
Objective-Cã§ã¯ãã¡ãœãããäœãè¿ããã¯äžæã§ãã ãªããžã§ã¯ãããªãå Žåã-1ãNSNotFoundããŸãã¯éçºè
ã®ã¿ãç¥ã£ãŠããä»ã®å®æ°ã«ãªããŸãã Swiftã§åãã¡ãœãããèŠããšãçå笊ãä»ããIntã衚瀺ãããŸãã
func indexOF(object: AnyObject) -> Int?
ãã®æ§é ã¯ãæ°å€ãŸãã¯voidãè¿ãããããšã瀺ããŠããŸãã ãããã£ãŠãããã¯ãããIntãåãåã£ãããã¢ã³ããã¯ããå¿
èŠããããŸãã 解åã«ã¯ãå®å
šïŒãã¹ãŠãif / elseã«å€ããïŒãšåŒ·å¶ã®2çš®é¡ããããŸãã åŸè
ã䜿çšã§ããã®ã¯ãä»®æ³ããã¯ã¹ã«å€ãããããšã確å®ã«ããã£ãŠããå Žåã®ã¿ã§ãã 圌ãããã«ããªãå Žåãå®è¡æã«ã¯ã©ãã·ã¥ãçºçããŸãã
ããã§ãã¯ã©ã¹ãæ§é ãããã³åæã®äž»ãªæ©èœã«ã€ããŠç°¡åã«èª¬æããŸãããã¯ã©ã¹ãšæ§é ã®äž»ãªéãã¯ãåç
§ã«ãã£ãŠæž¡ãããããšã§ãã æ§é äœã¯å€ã§æž¡ãããŸãã ããã¥ã¡ã³ããŒã·ã§ã³ãç§éã«èšãããã«ãæ§é ã䜿çšããããšã¯ã¯ããã«å°ãªããªãœãŒã¹ãæ¶è²»ããŸãã ãããŠããã¹ãŠã®ã¹ã«ã©ãŒåãšããŒã«å€æ°ã¯æ§é äœãéããŠå®è£
ãããŸãã
転éãéžæããããšæããŸãã ãããã¯ãCãObjective-Cãããã³ãã®ä»ã®èšèªã®å¯Ÿå¿ããèšèªãšã¯ãŸã£ããç°ãªããŸãã ããã¯ãã¯ã©ã¹ãæ§é ãããã³ãã以äžã®çµã¿åããã§ãã ç§ã®èšãããããšã瀺ãããã«ãäŸãèããŠã¿ãŸãããã
enum
ã䜿çšããŠããªãŒãå®è£
ãããšããŸãã 3ã€ã®èŠçŽ ïŒç©ºãããŒããã·ãŒãïŒãå«ãå°ããªãªã¹ãããå§ããŸãããã
enum Tree { case Empty case Leaf case Node }
ãããã©ããããã¯äžæã§ãã ããããSwiftã§ã¯ãå
enum
èŠçŽ ã¯äœããã®å€ãä¿æã§ããŸãã ãããè¡ãã«ã¯ã
Int
ãã·ãŒãã«è¿œå ããããŒãã«ã¯ããã«2ã€ã®ããªãŒããããŸãã
enum Tree { case Empty case Leaf(Int) case Node(Tree, Tree) }
ãã ããSwiftã¯ãžã§ããªãã¯ããµããŒãããŠãããããä»»æã®ã¿ã€ãã®ãµããŒããããªãŒã«è¿œå ããŸãã
enum Tree<T> { case Empty case Leaf(T) case Node(Tree, Tree) }
ããªãŒå®£èšã¯æ¬¡ã®ããã«ãªããŸãã
let tree: Tree<Int> = .Node(.Leaf(1), .Leaf(1))
Swiftã¯ãããã®åãã³ã³ãã€ã«æ®µéã§è¡šç€ºãããããåæã®ååãæžãããšã¯ã§ããŸããã
Swiftã®
enum
ã«ã¯ãå¥ã®èå³æ·±ãæ©èœããããŸããæ§é äœãã¯ã©ã¹ã®ããã«ãé¢æ°èªäœãå«ãããšãã§ããŸãã ããªãŒã®æ·±ããè¿ãé¢æ°ãæžããããšããŸãã
enum Tree { case Empty case Leaf(Int) case Node(Tree, Tree) func depth<T>(t: Tree<T>) -> Int { return 0 } }
ãã®é¢æ°ã«ã€ããŠç§ãæ°ã«å
¥ããªãã®ã¯ãtreeãã©ã¡ãŒã¿ãŒãåãå
¥ããããšã§ãã é¢æ°ã«å€ãè¿ãã ãã§ãäœãæž¡ãå¿
èŠã¯ãããŸããã ããã§ã¯ãSwiftã®å¥ã®èå³æ·±ãæ©èœããã¹ããããé¢æ°ã䜿çšããŸãã ãªããªã ã¢ã¯ã»ã¹ä¿®é£Ÿåã¯ãŸã ãããŸãã-ããã¯é¢æ°ããã©ã€ããŒãã«ãã1ã€ã®æ¹æ³ã§ãã ãããã£ãŠãããªãŒã®æ·±ããèæ
®ãã
_depth
ããããŸãã
enum Tree<T> { case ⊠func depth() -> Int { func _depth<T>(t: Tree<T>) -> Int { return 0 } return _depth(self) } }
æšæºã®ã¹ã€ããã衚瀺ãããŸããè¿
éãªãã®ã¯ãããŸãããããªãŒã空ã®ãšãã«ãªãã·ã§ã³ãåŠçããã ãã§ãã ããã«èå³æ·±ãããšãå§ãŸããŸãã ã·ãŒãã«ä¿åãããŠããå€ã解åããŸãã ããããç§ãã¡ã¯ãããå¿
èŠãšããããŠããããè¿ãã ããªã®ã§ãã¢ã³ããŒã¹ã³ã¢ã䜿çšããŸããã€ãŸããã·ãŒãå
ã®å€æ°ã¯å¿
èŠãããŸããã 次ã«ãå·Šå³ã®ããŒããååŸããããŒããã¢ã³ããã¯ããŸãã 次ã«ãdepthé¢æ°ãååž°çã«åŒã³åºããŠãçµæãè¿ããŸãã çµæãšããŠãããã€ãã®åºæ¬çãªæäœã§
enum
å®è£
ããããã®ãããªããªãŒãååŸããŸãã
enum Tree<T> { case Empty case Leaf(T) case Node(Tree, Tree) func depth() -> Int { func _depth<T>(t: Tree<T>) -> Int { switch t { case .Empty: return 0 case .Leaf(let_): return 1 case .Node(let lhs, let rhs): return max(_depth(lhs), _depth(rhs)) } } return _depth(self) } }
ãã®
enum
ã®èå³æ·±ãç¹ã¯ããã®
enum
ã§èšè¿°ããããã®ã³ãŒãã¯æ©èœããã¯ãã§ãããæ©èœããªãããšã§ãã çŸåšã®ããŒãžã§ã³ã§ã¯ããã°ã«ããã
enum
ã¯ååž°åããµããŒãããŠããŸããã å°æ¥çã«ã¯åäœããŸãã ãããŸã§ã®ãšããããã®ãã°ãåé¿ããããã«ããŸããŸãªããã¯ã䜿çšãããŠããŸãã ãã®ãã¡ã®1ã€ã«ã€ããŠã¯å°ãåŸã§èª¬æããŸãã
ç§ã®ã¹ããŒãªãŒã®æ¬¡ã®æ®µèœã¯ãæšæºã©ã€ãã©ãªã§é
åãèŸæžãããã³æååïŒãã£ãŒã ã®ã³ã¬ã¯ã·ã§ã³ïŒã§è¡šãããã³ã¬ã¯ã·ã§ã³ã§ãã ã¹ã«ã©ãŒã®ãããªã³ã¬ã¯ã·ã§ã³ã¯æ§é äœã§ãããNSDictionaryãNSArrayãªã©ã®æšæºçãªåºç€ã¿ã€ããšã亀æå¯èœã§ãã ããã«ãäœããã®å¥åŠãªçç±ã§NSSetã¿ã€ãããªãããšãããããŸãã ãããã¯ããããããŸãã«ããŸãã«äœ¿çšãããŸãã äžéšã®æäœïŒäŸïŒ
filter
ããã³
reverse
ïŒã«ã¯é
延èšç®ããããŸãïŒ
func filter<S :Sequence>(âŠ) -> Bool) -> FilterSequenceView<S> func reverce<S :Collection âŠ>(source: C) -> ReverseView<C>
ã€ãŸã
FilterSequenceView
ããã³
ReverseView
ã¿ã€ãã¯ãåŠçãããã³ã¬ã¯ã·ã§ã³ã§ã¯ãªãããã®è¡šçŸã§ãã ããã¯ããããã®ã¡ãœããã®ããã©ãŒãã³ã¹ãé«ãããšã瀺ããŠããŸãã Objective-Cã§ã¯ããã®èšèªã®äœææç¹ã§ã¯èª°ããã®ãããªæŠå¿µã«ã€ããŠèããŠããªãã£ãããããã®ãããªunningãªæ§é ã¯èŠã€ãããŸããã çŸåšãã¬ã€ãžãŒã³ã³ãã¥ãŒãã£ã³ã°ã¯ããã°ã©ãã³ã°èšèªã«æµžéããŠããŸãã ç§ã¯ãã®åŸåã奜ãã§ãæã«ã¯éåžžã«å¹æçã§ãã
次ã®æ©èœã¯ãããããæ°ããèšèªã«äœããã®åœ¢ã§èå³ãæã£ãŠãããã¹ãŠã®äººã«ãã£ãŠæ¢ã«æ°ã¥ãããŠããŸãã ãããããšã«ãã圌女ã«ã€ããŠã話ãããŸãã Swiftã«ã¯å€æ°ã®çµã¿èŸŒã¿ã®äžå€æ§ããããŸãã å€æ°ã宣èšããã«ã¯ã2ã€ã®æ¹æ³ããããŸã
var
ãš
let
ãŸãã åè
ã®å Žåãå€æ°ãå€æŽã§ããŸããåŸè
ã®å Žå-ãããã
var = 3 b += 1 let a = 3 a += 1
ããããé¢çœãããšãå§ãŸããŸãã ããšãã°ã
let
ãã£ã¬ã¯ãã£ãã䜿çšããŠå®£èšããããã£ã¯ã·ã§ããªãèŠããšãããŒãå€æŽãŸãã¯æ°ããããŒãè¿œå ããããšãããšããšã©ãŒãçºçããŸãã
let d = ["key": 0] d = ["key"] = 3 //error d.updateValue(1, forKey: "key1") //error
é
åã¯å°ãç°ãªããŸãã é
åã®ãµã€ãºãå¢ããããšã¯ã§ããŸãããããã®èŠçŽ ãå€æŽããããšã¯ã§ããŸãã
let c = [1, 2, 3] c[0] = 3
å®éãããã¯éåžžã«å¥åŠã§ããäœãåé¡ãªã®ããç解ããããšãããšãèšèªéçºè
ã«ãã£ãŠç¢ºèªããããã°ã§ããããšãå€æããŸããã è¿ãå°æ¥ãä¿®æ£ãããŸãã ããã¯æ¬åœã«éåžžã«å¥åŠãªåäœã§ãã
Swiftã®æ¡åŒµæ©èœã¯ãObjective-Cã®ã«ããŽãªã«éåžžã«äŒŒãŠããŸãããããèšèªã«æµžéããŠããŸãã Swiftã§ã€ã³ããŒããèšè¿°ããå¿
èŠã¯ãããŸãããã³ãŒãå
ã®ä»»æã®å Žæã«æ¡åŒµæ©èœãèšè¿°ã§ããŸããããã¯ããã¹ãŠã®ã³ãŒãã«ãã£ãŠéžæãããŸãã ãããã£ãŠãåæ§ã«ãæ§é ããã³ãšãã ãæ¡åŒµããããšãå¯èœã§ããããããæã
䟿å©ã§ãã æ¡åŒµæ©èœã®å©ããåããŠãã³ãŒããéåžžã«ããŸãæ§æã§ããŸããããã¯æšæºã©ã€ãã©ãªã«å®è£
ãããŠããŸãã
struct: Foo { let value : Int } extension Foo : Printable { var description : String { get {return "Foo"} } } extension Foo : Equatable { } func ==(lhs: Foo, rhs: Foo) -> Bool { return lhs.value == rhs.value }
次ã«ãSwiftã«ãªããã®ã«ã€ããŠè©±ããŸãããã ç¹å®ã®äœããæ¬ ããŠãããšã¯èšããŸãã æ¬çªç°å¢ã§ã¯ãŸã 䜿çšããŠããŸããã ããããå€ãã®äººãäžæºãèšããã®ããããŸãã
- ããªããã»ããµã ããªããã»ããµããªãå Žåãå€ãã®ã³ãŒããçæããã¯ãŒã«ãªãã¯ãããªãããšã¯æããã§ãã ã¯ãã¹ãã©ãããã©ãŒã éçºãå°é£ã§ãã
- äŸå€ã å®è¡ã®ã¡ã«ããºã ã¯å®å
šã«ååšããŸããããNSExceptionãã¹ããŒããããšãã§ããObjective-Cã©ã³ã¿ã€ã ãããããã¹ãŠåŠçããŸãã
- ã¢ã¯ã»ã¹å¶åŸ¡ã Swiftã«é¢ããæ¬ãèªãã åŸãå€ãã®äººãã¢ã¯ã»ã¹ä¿®é£Ÿåã®æ¬ åŠã«æ··ä¹±ããŸããã Objective-Cã§ã¯ããã¯ããã§ã¯ãªãã誰ãããããå¿
èŠã§ãããšç解ããæ°ããèšèªã§åŸ
ã£ãŠããŸããã å®éãéçºè
ã«ã¯ããŒã¿ã¢ã¯ã»ã¹ä¿®é£Ÿåãå®è£
ããæéããããŸããã§ããã 圌ãã¯ãã§ã«æçµãªãªãŒã¹ã«ãããŸãã
- KVOãKVCã æãããªçç±ã«ãããããŒå€ã®ç£èŠãšããŒå€ã®ã³ãŒãã£ã³ã°ã¯ãããŸããã Swiftã¯éçèšèªã§ããããããã¯åçèšèªã®æ©èœã§ãã
- ã³ã³ãã€ã©ãŒå±æ§ã éæšå¥šã®ã¡ãœãããç¹å®ã®ãã©ãããã©ãŒã ã«ã¡ãœããããããã©ãããå ±åããã³ã³ãã€ã©ãŒæ瀺ã¯ãããŸããã
performSelector.
Swiftã®ãã®ã¡ãœããã¯å®å
šã«åã蟌ãŸããŠããŸãã ããã¯ããªãå®å
šã§ã¯ãªããããObjective-Cã§ã泚æããŠäœ¿çšããå¿
èŠããããŸãã
ããã§ã¯ãObjective-CãšSwiftã«å¹²æžããæ¹æ³ã«ã€ããŠèª¬æããŸãããã SwiftããObjective-Cã³ãŒããåŒã³åºãããšãã§ããããšã¯èª°ãããã§ã«ç¥ã£ãŠããŸãã éã®æ¹åã§ã¯ããã¹ãŠããŸã£ããåãããã«æ©èœããŸãããããã€ãã®å¶éããããŸãã åæãã¿ãã«ãäžè¬åãããåã¯æ©èœããŸããã ãã€ã³ã¿ãŒã¯ãããŸããããCoreFoundationåã¯çŽæ¥åŒã³åºãããšãã§ããŸãã å€ãã®äººã«ãšã£ãŠãSwiftããçŽæ¥C ++ã³ãŒããåŒã³åºããªãããšãé害ã«ãªã£ãŠããŸãã ãã ããObjective-Cã§ã©ãããŒãäœæããæ¢ã«åŒã³åºãããšãã§ããŸãã ããŠãSwiftããå®è£
ãããŠããªãObjective-Cã¯ã©ã¹ã§ã¯ãµãã¯ã©ã¹åã§ããªãã®ã¯åœç¶ã§ãã
äžã§èšã£ãããã«ãããã€ãã®ã¿ã€ãã¯äº€æå¯èœã§ãïŒ
NSArray < - > Array;
NSDictionary < - > Dictionary
;NSNumber - > Int, Double, Float
ã
Swiftã§èšè¿°ãããã¯ã©ã¹ã®äŸã瀺ããŸãããObjective-Cã§äœ¿çšã§ããŸããå¿
èŠãªãã£ã¬ã¯ãã£ãã¯1ã€ã ãã§ãã
@objc class Foo { int (bar: String) { } }
Objective-Cã®ã¯ã©ã¹ã«å¥ã®ååïŒããšãã°ã
Foo
ã§ã¯ãªã
objc_Foo
ïŒãä»ããã¡ãœããã®ã·ã°ããã£ãå€æŽããå Žåããã¹ãŠãå°ãè€éã«ãªããŸãã
@objc(objc_Foo) class Foo{ @objc(initWithBar:) init (bar: String) { } }
ãããã£ãŠãObjective-Cã§ã¯ãã¹ãŠã絶察ã«æåŸ
ãããŸãã
Foo *foo = [[Foo alloc] initWithBar:@"Bar"];
åœç¶ããã¹ãŠã®æšæºãã¬ãŒã ã¯ãŒã¯ã䜿çšã§ããŸãã ãã¹ãŠã®ããããŒã«ã€ããŠãSwiftã§ã®ãããã®è¡šçŸã¯èªåçã«çæãããŸãã
convertPoint
é¢æ°ããããšããŸãããïŒ
- (CGPoint)convertPoint:(CGPoint)point toWindow:(UIWindow *)window
å¯äžã®éãã¯ãããŸãããå®å
šã«Swiftã«å€æãããŸãïŒ
UIWindow
è¿ãã«æå笊ããããŸãã ããã¯ãåè¿°ã®éåžžã«ãªãã·ã§ã³ã®ã¿ã€ãã瀺ããŠããŸãã ã€ãŸã nilããããããããã§ãã¯ããªãå Žåãå®è¡æã«ã¯ã©ãã·ã¥ãçºçããŸãã ããã¯ããžã§ãã¬ãŒã¿ãŒããããã®ããããŒãäœæãããšãã«ãnilã«ã§ãããã©ããããããªãããããããã®æå笊ãã©ãã«ã§ãé
眮ããããã§ãã ããããããã«åœŒãã¯ãããäœããã®åœ¢ã§ä¿®æ£ããã§ãããã
finc convertPoint(point: CGPoint, toWindow window: UIWindow!) -> GCPoint
詳现ã«ã¯ãSwiftã®å
éšãšããã©ãŒãã³ã¹ã«ã€ããŠè©±ãã®ã¯ææå°æ©ã§ããããã¯ãçŸåšã®ã©ã³ã¿ã€ã ãæåã®ããŒãžã§ã³ãŸã§çãæ®ããã©ãããããããªãããã§ãã ãããã£ãŠããããŸã§ã®ãšããããã®ãããã¯ã«ã€ããŠã¯è¡šé¢çã«ã®ã¿è§ŠããŸãã ãŸãããã¹ãŠã®Swiftãªããžã§ã¯ãã¯Objective-Cãªããžã§ã¯ãã§ãã æ°ããã«ãŒãã¯ã©ã¹SwiftObjectã衚瀺ãããŸãã ã¡ãœããã¯ãã¯ã©ã¹ã§ã¯ãªãä»®æ³ããŒãã«ã«ä¿åãããããã«ãªããŸããã å¥ã®èå³æ·±ãæ©èœã¯ãå€æ°ã®åãåå¥ã«ä¿åãããããšã§ãã ãããã£ãŠãã¯ã©ã¹ããã®å Žã§ãã³ãŒãããã®ã¯ããå°ãé£ãããªããŸãã ã¡ãœããã®ã¡ã¿ããŒã¿ããšã³ã³ãŒãããã«ã¯ãååãã³ã°ãªã³ã°ãšåŒã°ããã¢ãããŒãã䜿çšãããŸãã ããšãã°ã
Bool
è¿ã
bar
ã¡ãœãããæã€
Foo
ã¯ã©ã¹ãèŠãŠãã ããïŒ
class Foo { func bar() -> Bool { return false } }
ãã€ããªãèŠããšã
bar
ã¡ãœããã®å Žåã次ã®åœ¢åŒã®çœ²åã衚瀺ãããŸãïŒ
_TFC9test3Foo3barfS0_FT_Sb
ããã«ã3æåã®é·ãã®
Foo
ããããã¡ãœããã®é·ãã3æåã§ããæåŸã®
Sb
ã¯ãã¡ãœããã
Bool
è¿ãããšãæå³ããŸãã ããã¯éåžžã«æ¥œããããšãšã¯é¢ä¿ãããŸãããXcodeã®ãããã°ãã°ã¯ãã¹ãŠãã®åœ¢åŒã«å®å
šã«è©²åœãããããããããèªã¿åãããšã¯ããŸã䟿å©ã§ã¯ãããŸããã
ãããã誰ãããã§ã«Swiftãéåžžã«é
ãããšãèªãã§ããã§ãããã æŠããŠãããã¯äºå®ã§ããããããç解ããŠã¿ãŸãããã
-O0
ãã©ã°ã䜿çšããŠã³ã³ãã€ã«ããå Žåãã€ãŸã æé©åãè¡ããªããšãSwiftã®C ++ã¯10ã100åé
ããªããŸãã
-O3
ãã©ã°ãæå®ããŠã³ã³ãã€ã«ãããšãC ++ããã10åé
ããªããŸãã
-Ofast
ãã©ã°
-Ofast
ãã©ã³ã¿ã€ã ãªã©ã§intãªãŒããŒãããŒãã§ãã¯ãç¡å¹ã«ãããããããŸãå®å
šã§
-Ofast
ãŸããã å®çšŒåç°å¢ã§ã¯äœ¿çšããªãã»ããããã§ãããã ãã ããC ++ã®ã¬ãã«ãŸã§ããã©ãŒãã³ã¹ãæ¹åã§ããŸãã
ããªãã¯èšèªãéåžžã«è¥ãããšãç解ããå¿
èŠããããŸããããã¯ãŸã ããŒã¿çã§ãã å°æ¥ãé床ã«é¢ããäž»ãªåé¡ã¯ä¿®æ£ãããŸãã ããã«ãSwiftã®Objective-Cã¬ã¬ã·ãŒã¹ãã¬ããã¯ãããšãã°ãSwiftã«ã¯æ¬è³ªçã«äžèŠãªèšå€§ãªæ°ã®ä¿æãšãªãªãŒã¹ããããŸãããããã©ãŒãã³ã¹ãéåžžã«é
ããªããŸãã
ããã«ãéçºããã»ã¹äžã«ééãããäºãã«ããŸãé¢ä¿ã®ãªãããšã«ã€ããŠã話ãããŸãã åè¿°ããããã«ããã¯ãã¯ãµããŒããããŠããªããããã¯ãã¹ãã©ãããã©ãŒã ãã¥ãŒãäœæããå¯äžã®æ¹æ³ã¯æ¬¡ã®ãšããã§ãã
#if os(iOS) typealias View = UView #else typealias View = NSView #endif class MyControl : View { }
ãã®
if
ã¯ããªããã»ããµã§ã¯ãªãããã©ãããã©ãŒã ããã¹ãããããã®åãªãèšèªæ§æèŠçŽ ã§ãã ãããã£ãŠãã©ã®ãã©ãããã©ãŒã ã«ããããè¿ãã¡ãœããã¯ãããŸããã ããã«å¿ããŠã
View
ãšã€ãªã¢ã¹ãäœæã
View
ã ãããã£ãŠãiOSãšOS Xã®äž¡æ¹ã§åäœãã
MyControl
ãäœæããŸãã
次ã®æ©èœ-ãµã³ãã«ãšã®æ¯èŒ-ç§ã¯æ¬åœã«å¥œãã§ãã ç§ã¯é¢æ°åèšèªãå°ã奜ãã§ãéåžžã«åºã䜿çšãããŠããŸãã äŸãšããŠåé¡ãèããŠã¿ãŸããããå¹³é¢äžã«ç¹ãããã4ã€ã®è±¡éã®ãã¡ã©ããå
¥ã£ãŠããããç解ãããã®ã§ãã ç§ãã¡ã¯çãObjective-Cã§ã©ã®ãããªã³ãŒãã«ãªãã®ãæ³åããŠããŸãã å象éããšã«ãxãšyããã®ãã¬ãŒã ã¯ãŒã¯ã«è©²åœãããã©ããã確èªããå¿
èŠãããã絶察ã«ã¯ã€ã«ããªæ¡ä»¶ããããŸãã
let point = (0, 1) if point.0 >= 0 && point.0 <= 1 && point.1 >= 0 && point.1 <= 1 { println("I") } ...
ãã®å ŽåãSwiftã¯ããã€ãã®äŸ¿å©ãªããŒã¹ãæäŸããŸãã æåã«ã3ã€ã®ãã€ã³ããæã€ããªãããŒãªç¯å²æŒç®åããããŸãã ãããã£ãŠã
case
ã¯ããã€ã³ãã第1象éã«è©²åœãããã©ããã確èªã§ããŸãã ãããŠãã³ãŒãå
šäœã¯æ¬¡ã®ããã«ãªããŸãã
let point = (0, 1) switch point { case (0, 0) println("Point is at the origin") case (0...1, 0...1): println("I") case (-1...0, 0...1): println("II") case (-1...0, -1...0): println("III") case (0...1, -1...0): println("IV") default: println("I don't know") }
ç§ã®æèŠã§ã¯ãããã¯Objective-CãæäŸã§ãããã®ããã10åèªã¿ããããªã£ãŠããŸãã
Swiftã«ã¯ãé¢æ°åããã°ã©ãã³ã°èšèªãããçãŸãã絶察çãªãããããã1ã€ãããŸã-é¢æ°ã®ã«ãªãŒåïŒ
func add(a: Int)(b: Int) -> Int { return a + b } let foo = add(5)(b: 3) // 8 let add5 = add(5) // (Int) -> Int let bar = add(b: 3) // 8
ãã®ãããªããªãããŒãªå®£èšãæã€
add
é¢æ°ãããããšãããããŸãã1察ã§ã¯ãªããã©ã¡ãŒã¿ãŒä»ãã®2çµã®ãã©ã±ããã§ãã ããã«ããããã®é¢æ°ãã»ãŒéåžžã®ããã«åŒã³åºããŠçµæ8ãååŸãããã1ã€ã®ãã©ã¡ãŒã¿ãŒã§åŒã³åºãããšãã§ããŸãã 2çªç®ã®ã±ãŒã¹ã§ã¯ãéæ³ãçºçããŸããåºåã§ã¯ã
Int
ãåãåãã
Int
ãè¿ãé¢æ°ãååŸããŸãã 5ã€ã«
add
é¢æ°ãéšåçã«é©çšããŸããã ãããã£ãŠãããªãã«ã§
add5
é¢æ°ã䜿çšãããšã8ã®æ°åãåŸãããŸãã
ç§ãèšã£ãããã«ãããªããã»ããµãæ¬ èœããŠããã®ã§ã
assert
å®è£
assert
ããšããç°¡åãªããšã§ã¯ãããŸããã ç¬èªã®äœããã®
assert
ã¿ã¹ã¯ããã
assert
ãŸãã ãããã°ã®ããã«ãã¹ãã§ããŸãããã¢ãµãŒãã§å®è¡ãããªãã³ãŒããã¯ããŒãžã£ãŒãšããŠæž¡ãå¿
èŠããããŸãã ã€ãŸã ãã¬ãŒã¹ã®äžã«
5 % 2
ããããšãããããŸãã çšèªã§ã¯ãObjective-Cã¯ãããã¯ã§ãã
func assert(condition:() -> Bool, message: String) { #if DEBUG if !condition() { println(message) } #endif } assert({5 % 2 == 0}, "5 isn't an even number.")
誰ããã®ãããªã¢ãµãŒãã䜿çšããªãããšã¯æããã§ãã ãã®ãããSwiftã«ã¯èªåééããããŸãã ã¡ãœãã宣èšã§ã¯ããããã
@autoclosure
ãåç
§ããŸããæåã®åŒæ°ã¯ã¯ããŒãžã£ãŒã«ãªããäžæ¬åŒ§ã¯çç¥ã§ããŸãã
func assert(condition: @auto_closure () -> Bool, message: String) { #if DEBUG if !condition() { println(message) } #endif } assert(5 % 2 == 0, "5 isn't an even number.")
ææžåãããŠããªããéåžžã«äŸ¿å©ãªãã1ã€ã®ããšã¯ãæ瀺çãªåå€æã§ãã Swiftã¯åä»ãèšèªã§ãããããObjective-Cã®ããã«ããªããžã§ã¯ãã«idåãèšå®ããããšã¯ã§ããŸããã ãããã£ãŠã次ã®äŸãæ€èšããŠãã ããã åæåäžã«å€ãååŸãã
Box
æ§é ããããå€æŽã§ããªããšä»®å®ããŸãã ãããŠãããã±ãŒãžåããã
Int
ãŠãããããããŸãã
struct Box<T> { let _value : T init (_ value: T) { _value = value } } let boxedInt = Box(1)
Int
ãåãå
¥ããé¢æ°ããããŸãã ãããã£ãŠãããã§
boxedInt
転éããããšã¯ã§ããŸããã ã³ã³ãã€ã©ã¯ã
Box
Int
å€æãããªãããšãéç¥ããŸãã è·äººã¯ã¹ã€ããã®æ ¹æ§ãå°ãåãè£ãã
Box
ã¿ã€ããããèªäœãé ãå€ã«å€æã§ããé¢æ°ãèŠã€ããŸããã
extension Box { @conversion Func __conversion() -> T { return _value } } foo(boxedInt) //success
ãŸããèšèªã®éçãªåä»ãã§ã¯ãObjective-Cã§å®è¡ã§ãããããã¯ã©ã¹ãè¿åããŠã¡ãœããã眮ãæããããšã¯ã§ããŸããã çŸåšã®ç¶æ
ããã¯ããªããžã§ã¯ãããããã£ã®ãªã¹ããååŸããŠãçŸæç¹ã§ãããã®å€ã衚瀺ããããšããã§ããŸããã ã€ãŸã ã¡ãœããã«é¢ããæ
å ±ãåãåãããšã¯ã§ããŸããã
struct Foo { var str = "Apple" let int = 13 func foo() { } } reflect(Foo()).count
swiftããCã³ãŒããçŽæ¥åŒã³åºãããšãã§ããŸãã ãã®æ©èœã¯ããã¥ã¡ã³ãã«ã¯åæ ãããŠããŸãããã圹ã«ç«ã€å ŽåããããŸãã
@asmname("my_c_func") func my_c_func(UInt64, CMutablePointer<UInt64>) -> CInt;
ãã¡ãããSwiftã¯ã³ã³ãã€ã«ãããèšèªã§ãããããã¯ã¹ã¯ãªããã®ãµããŒãã劚ããŸããã ãŸãã
xcrun swift
ã³ãã³ãã§èµ·åããã察話åã©ã³ã¿ã€ã ããããŸãã ããã«ãéåžžã®ã¹ã¯ãªããèšèªã§ã¯ãªããSwiftã§çŽæ¥ã¹ã¯ãªãããäœæã§ããŸãã ãããã¯
xcrun -i 'file.swift'
ã䜿çšããŠ
xcrun -i 'file.swift'
ãŸãã
æåŸã«ãäžèŠã®äŸ¡å€ããããªããžããªã«ã€ããŠèª¬æããŸãã
- BDDãã¹ããã¬ãŒã ã¯ãŒã¯ïŒ ã¯ã€ã㯠ã ããã¯ã誰ããæ¬ ããŠããæåã®ãã®ã§ãã ãã¬ãŒã ã¯ãŒã¯ã¯ç©æ¥µçã«éçºãããŠãããæ°ãããããã£ãŒã絶ããè¿œå ãããŠããŸãã
- ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ïŒ RXSwift ããã¯ãSwiftãæäŸããã³ã³ã¹ãã©ã¯ãã䜿çšããReactiveCocoaã®åèã§ãã
- ã¢ãã«ãããã³ã°ïŒ ã¯ã©ã¹ã ã Swiftã®ã¢ããã°ãã³ãã«ã JSONãªããžã§ã¯ããè¿
éãªãªããžã§ã¯ãã«ãããã³ã°ã§ããŸãã éçºã«åœ¹ç«ã€å€ãã®èå³æ·±ãããã¯ã䜿çšãããŸãã
- 䟿å©ãª JSONåŠçïŒ SwiftyJSON ããã¯æåéã200è¡ã®éåžžã«å°ããªã©ã€ãã©ãªã§ãã ããããããã¯åæã®å®å
šãªåã瀺ããŠããŸãã