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

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

m_watanabe
October 17, 2014
680

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

m_watanabe

October 17, 2014
Tweet

Transcript

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

    ɾObjective-C  オブジェクトを参照するポインタが無い ! ɾSwift  存在しない値  
  2. 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)されている
  3. Optional ɾOptionalな変数は⾮非Optionalな変数と同じようには扱えない var int1: Int = 1 println(int1 + 2)

    // ->"3" ! ! var int2: Int? = 1 println(int2 + 2) // コンパイルエラー Optional<Int>    と    Int    ではそもそも型が違う
  4. 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()) // アンラップ(!)する際にランタイムエラー 取り出している
  5. 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で取り出す
  6. 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になる
  7. 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()) // ランタイムエラーが発⽣生する
  8. クラスのプロパティ class Person { var name: String var age: Int

    = 30 // 宣⾔言時に初期化 var address: String init() { // init内で初期化 self.name = "" self.address = "Tokyo" } } ɾॳظ஋͕ܾ·͍ͬͯΔ৔߹͸ඇ0QUJPOBMͰఆٛ ! ɾએݴ࣌ʹॳظԽ͠ͳ͍৔߹ɺJOJU ͰॳظԽ͠ͳ͍ͱ࣮ߦͰ͖ͳ͍
  9. クラスのプロパティ 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Ͱએݴ͢Δ
  10. クラスのプロパティ 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Ͱએݴ͢Δ
  11. 関数の返り値 ɾ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! }
  12. 関数の返り値 ɾ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! }
  13. 関数の返り値 ɾ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 }
  14. 関数の返り値 ɾ؆୯ʹݴ͏ͱ class Team { func ios() -> AnyObject? {

    return "nabe" } func and() -> AnyObject { return "fujiwarano" } func sdk() -> AnyObject! { return “icchi" } }
  15. 関数の返り値 ɾ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" }
  16. 関数の引数 ্ه͸ҧ͏ؔ਺ͱͯ͠ѻΘΕΔɻ class Test { func printNum(num : NSNumber) ->

    String { return "printNum A" } ! func printNum(num : NSNumber?) -> String { return "printNum B" } }
  17. 関数の引数 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" } }