Upgrade to Pro — share decks privately, control downloads, hide ads and more …

第4回Swift Study ~Optionalについて詳しく知りたい~

Caaa593ab0d144c5ee63c4e620171188?s=47 m_watanabe
October 17, 2014
670

第4回Swift Study ~Optionalについて詳しく知りたい~

Caaa593ab0d144c5ee63c4e620171188?s=128

m_watanabe

October 17, 2014
Tweet

Transcript

  1. 第4回 Swift Study 〜~ Optionalについて詳しく知りたい 〜~

  2. Optional ɾOptionalとは Optionals are an example of the fact that

    Swift is a type safe language.
  3. Optional ɾSwiftでは通常の変数にnilを代⼊入できない   var intValue: Int = nil // コンパイルエラー

    ɾObjective-C  オブジェクトを参照するポインタが無い ! ɾSwift  存在しない値  
  4. Optional ɾOptionalを指定すると変数にnilを代⼊入できる   var intValue: Int? = nil // OK

    これ  
  5. Optional ɾʮT ?」って書くけど、実は「Optional<T>」    var intValue: Int? = nil   //

    Optional !  var strValue: String? = nil   // Optional  var intValue: Optional<Int> = nil // Optional !  var strValue: Optional<String> = nil // Optional ラップ(Wrap)されている
  6. Optional ɾOptionalな変数は⾮非Optionalな変数と同じようには扱えない var int1: Int = 1 println(int1 + 2)

    // ->"3" ! ! var int2: Int? = 1 println(int2 + 2) // コンパイルエラー Optional<Int>    と    Int    ではそもそも型が違う
  7. Optional ɾOptionalな変数を扱うにはアンラップ(Unwrap)する必要がある ˙アンラップ(Unwrap)              

     =  Optional<T>からTを取り出すこと
  8. Unwrap ɾΞϯϥοϓ(Unwrap)するやり⽅方は複数あるらしい 1.Forced Unwrapping ! 2.Optional Chaining ! 3.Optional Binding

    ! 4.Implicitly Unwrapped Optional
  9. Forced Unwrapping ɾʮ!」をつかってアンラップする⽅方法 class Team { func ios() -> String

    { return "nabe" } } var team: Team? = Team() println(team!.ios()) // アンラップ(!)できる -> "nabe" ! println(team.ios()) // コンパイルエラー(ラップされたままの状態では呼べない) ! team = nil println(team!.ios()) // アンラップ(!)する際にランタイムエラー 取り出している
  10. Optional Chaining ɾʮ?」をつかってアンラップ class Team { func ios() -> String

    { return "nabe" } } var team: Team? = Team() println(team?.ios()) // アンラップできる -> "Optional("nabe")" ! team = nil println(team?.ios()) // アンラップ時にnilが返ってくる -> "nil" Optionalで取り出す
  11. Optional Binding ɾif⽂文やwhile⽂文の条件で宣⾔言され、Optionalな変数を代⼊入された変数が、
  ⾮非Optional型になることを利⽤用してアンラップする class Team { func ios() ->

    String { return "nabe" } } var team: Team? = Team() ! if let unwrappedteam = team { println(unwrappedteam.ios()) // ->“nabe" } ! team = nil if let unwrappedteam = team { // ->false println(unwrappedteam.ios()) } unwrappedteamは⾮非Optionalになる
  12. Implicitly Unwrapped Optional ɾOptional(Optional<T>)ではなく、ImplicitlyUnwrappedOptionalを
  使って、暗黙的にアンラップする class Team { func ios()

    -> String { return "nabe" } } // 「?」ではなく「!」を使って宣⾔言 var team: Team! = Team() println(team.ios()) // 暗黙的にアンラップされる -> "nabe" ! team = nil println(team.ios()) // ランタイムエラーが発⽣生する
  13. Implicitly Unwrapped Optional ɾʮUFBNʯ͸ ImplicitlyUnwrappedOptionalUFBNΛ
 ؆୯ʹॻ͍͚ͨͩͷ΋ͷ ちなみにɾɾɾɾ

  14. まとめ ɾ*NQMJDJUMZ6OXSBQQFE0QUJPOBM   ! ɾOJM͸୅ೖͰ͖Δ ɾ࢖༻͢Δͱ͖ʹ҉໧తʹΞϯϥοϓ͞ΕΔ ɾOJMʹରͯ͠Ξϯϥοϓ͢ΔͱɺϥϯλΠϜΤϥʔ͕ൃੜ͢Δ ɾ0QUJPOBM 

    ! ɾOJM͸୅ೖͰ͖Δ ɾ࢖༻͢Δͱ͖͸໌ࣔతͳΞϯϥοϓ͕ඞཁ ɾOJMʹରͯ͠Ξϯϥοϓ͢ΔͱɺOJMͰฦ٫͞ΕΔ
  15. いつ使うの? ࣮ࡍͷίʔσΟϯάͰ4XJGUͰ0QUJPOBMͷ͜ͱΛߟྀ͢ΔओͳγνϡΤʔγϣϯ ɾΫϥεͷϓϩύςΟ ! ɾؔ਺ͷฦΓ஋ ! ɾؔ਺ͷҾ਺ ͱ͔͕ɺߟ͑ΒΕΔɻ

  16. クラスのプロパティ class Person { var name: String var age: Int

    = 30 // 宣⾔言時に初期化 var address: String init() { // init内で初期化 self.name = "" self.address = "Tokyo" } } ɾॳظ஋͕ܾ·͍ͬͯΔ৔߹͸ඇ0QUJPOBMͰఆٛ ! ɾએݴ࣌ʹॳظԽ͠ͳ͍৔߹ɺJOJU ͰॳظԽ͠ͳ͍ͱ࣮ߦͰ͖ͳ͍
  17. クラスのプロパティ class SampleViewController: UIViewController { // サーバから取得した画像を保持する変数などは?にしておく var sampleImage: UIImage?

    override func viewDidLoad() { super.viewDidLoad() var url = NSURL(string: "http://example.png") var request = NSURLRequest(URL: url) NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in ! self.sampleImage = UIImage(data: data) } } } ɾॳظ஋͕ܾ·ͬͯͳ͍৔߹ͰɺॳظԽ͞Εͳ͍͔΋͠Εͳ͍ͱ͖͸
 ɹ0QUJPOBMͰએݴ͢Δ
  18. クラスのプロパティ class SampleViewController: UIViewController { // nilにはしたくない。インスタンス⽣生成時には初期化できないので!を付ける var sampleView: UIView!

    override func viewDidLoad() { super.viewDidLoad() // 必ず初期化 self.sampleView = UIView(frame: self.view.frame) self.view.addSubview(self.sampleView) } } ɾॳظ஋͸ܾ·ͬͯͳ͍͕ɺඞͣॳظԽ͠ͳ͚Ε͹ͳΒͳ͍৔߹͸
 ɹ6OXSBQͰએݴ͢Δ
  19. 関数の返り値 ɾ6*5BCMF7JFXͩͱEFRVFVF3FVTBCMF$FMM8JUI*EFOUJGJFSͷฦΓ஋͕
 "OZ0CKFDU ͳͷͰ6*5BCMF7JFX ͰΩϟετɾɾ͍΍ɺ6*5BCMF7JFXʂ
 ɹͷ΄͏͕Մಡੑ͕ɾɾɾɾ func tableView(tableView: UITableView, cellForRowAtIndexPath

    indexPath: NSIndexPath)          -> UITableViewCell   { // dequeueReusableCellWithIdentifierの返り値がAnyObject?なのでUITableViewCell?でキャスト var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell? if cell == nil { cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") } cell?.textLabel?.text = "Text" cell?.textLabel?.font = UIFont.systemFontOfSize(14.0) cell?.textLabel?.backgroundColor = UIColor.redColor() return cell! }
  20. 関数の返り値 ɾBT Λ͔ͭ͏ func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->

    UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell ! if cell == nil { cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") } ! cell?.textLabel?.text = "Text" cell?.textLabel?.font = UIFont.systemFontOfSize(14.0) cell?.textLabel?.backgroundColor = UIColor.redColor() ! return cell! }
  21. 関数の返り値 ɾ6*5BCMF7JFX$FMMͰड͚औΔ func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

    { var cell:UITableViewCell! = tableView.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell ! if cell == nil { cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") } ! cell.textLabel?.text = "Text" cell.textLabel?.font = UIFont.systemFontOfSize(14.0) cell.textLabel?.backgroundColor = UIColor.redColor() return cell }
  22. 関数の返り値 ɾ؆୯ʹݴ͏ͱ class Team { func ios() -> AnyObject? {

    return "nabe" } func and() -> AnyObject { return "fujiwarano" } func sdk() -> AnyObject! { return “icchi" } }
  23. 関数の返り値 ɾBT Λ༻͍ͯΩϟετͰ͖Δ͔֬ೝ var app: Team = Team() ! if

    let a = app.ios() as? String { println(a) // ->"nabe" } ! if let a = app.and() as? String { println(a) // ->"fujiwarano" } ! if let a = app.sdk() as? String { println(a) // ->"icchi" }
  24. 関数の返り値 ɾݒ೦ ɹ ɹɾຖճJGจ͖ͬͯνΣοΫ͢Δͷʁ ɹݱࡏ͸ͦΕ͕ҰൠతΒ͍͠ɻ ɹॻ͖ํΛ޻෉͠ͳ͍ͱJGจͰΧΦεʹͳΔ͔΋ɻ˞

  25. 関数の引数 ্ه͸ҧ͏ؔ਺ͱͯ͠ѻΘΕΔɻ class Test { func printNum(num : NSNumber) ->

    String { return "printNum A" } ! func printNum(num : NSNumber?) -> String { return "printNum B" } }
  26. 関数の引数 var test: Test = Test() ! test.printNum(NSNumber(int: 1)) //

    -> "printNum A" ! var value: NSNumber? = NSNumber(int: 1) ! test.printNum(value) // -> "printNum B" ! test.printNum(value!) // -> "printNum A" ! var value1: NSNumber? ! test.printNum(value1) // -> "printNum B" class Test { func printNum(num : NSNumber) -> String { return "printNum A" } ! func printNum(num : NSNumber?) -> String { return "printNum B" } }
  27. 関数の引数 ɾ৔߹ʹΑΓ·͢ɻʢέʔεόΠέʔεʣ ɹཧ༝ɿؔ਺ͷΦʔόʔϩʔυ͕Ͱ͖Δ͔Β

  28. まとめ ! ɾ4XJGUͰ͸0QUJPOBMͱ͍͏֓೦͕ݴޠϨϕϧͰଘࡏ͢Δ͓ӄͰɺ
 ɹίϯύΠϥ͕ϩδοΫνΣοΫͯ͘͠ΕΔͱ͍͏ܕ҆શͳ໘͕͋Γɺ
 ɹݴޠͱͯ͠ྑ͍ײ͡ɻ ! ɾJ04ΤϯδχΞ͸0CKFDUJWF$ͰOJM΁ͷϝιουݺͼग़͕͠
 ɹແࢹ͞ΕΔͷͰɺͦͷล͋Μ·Γҙࣝͨ͜͠ͱ͕ͳ͔ͬͨɻ
 ɹͦͷͨΊɺ0QUJPOBMͷඞཁੑΛ͋·Γײͯ͡ͳ͍ɻ
 


    ɾ4XJGUͰ͸0QUJPOBM͸ආ͚ͯ͸௨Εͳ͍ɻ
 ɹҙࣝ͠ͳ͕Β࣮૷͠ͳ͍ͱΫϥογϡܥͷόά͕૿Ճ͢Δ͔΋ɻ
  29. m(_ _)m