ssk blog

バンコクで働くエンジニアのメモ

swiftで画面遷移の方法どうする?Segueって使うの?

[Swiftを書き始めたときに悩んだことシリーズ]

Swiftを書き始めたときに[swift][画面遷移] で検索すると『segueを使った画面遷移の方法』などがでてきて、「segueって使うの?」ってなりました。

画面遷移をする方法を大きく分けると
- segueを使う
- コードで書く

周りのiOSエンジニアに聞いたら、業務でsegueを使っているところは、ほぼありませんでした。
シンプルな個人アプリとかを作るんだったら良いけど...
複数人で開発をするなら「1Storyboard + 1ViewController」のルールでコードを使って実装するのが良いと思います。

ゴリゴリに書く方法
class FirstViewController: UIViewController {
  @IBAction func tapNext(_ sender: Any) {
    let storyboard = UIStoryboard(name: String(describing: SecondViewController.self), bundle: nil)
    let vc = storyboard.instantiateInitialViewController()!
    navigationController?.pushViewController(vc, animated: true)
  }
}
問題点

- 遷移先にデータを渡すときにpublicな変数を作って渡す??? -> 良くない
- ごちゃごちゃしている


Androidで画面遷移を実装するときは、遷移先でstaticメソッドを作ってIntentを作成/取得して、遷移元は呼び出すようにしていました。
そのやり方が良いと思うので、iOSでも自分は以下のように実装しています。

自分がやっている実装方法

遷移元

class FirstViewController: UIViewController {
  @IBAction func tapNext(_ sender: Any) {
    let vc = SecondViewController.instantiate()
    navigationController?.pushViewController(vc, animated: true)
  }
}


遷移先

class SecondViewController: UIViewController {
 static func instantiate(): SecondViewController {
  let vc = StoryboardUtil.instantiate(self)
 return vc
    }
}

UIViewControllerを取得するための便利クラス

class StoryboardUtil {
 static func instantiate<T: UIViewController>(_ type: T.Type) -> T {
     let sb = UIStoryboard(name: String(describing: type), bundle: Bundle.main)
     let vc = sb.instantiateInitialViewController() as! T
     return vc
    }
}

こっちの方がスッキリ書けて良いと思います。
UIViewControllerを取得する方法は、protocolを作ってする方法など色々あるので、自分のしっくりくる方法でやって見てください^^

swiftのProtocolはextensionごとにするの?コードブロックの順番どうしよっか?

[Swiftを書き始めたときに悩んだことシリーズ]

Android(Java)しかやったことない私。
extensionについて理解し、「SwiftのProtocolはextensionごとにするの?」ってなりました

SwiftのProtocolはextensionごとにするの?

他社のコーディング規約を見ると、extensionごとにしているみたいなので、自分もそうしています。

recruit-lifestyle
SmartTechVentures



実際にコードを書き始めたときに「コードブロックの順番どうしよっか?」ってなりました。
recruit-lifestyleには、コードブロックの順番が書いてあり、参考にさせていただきました。
自分は、以下の順番にしています(しようとしています)。

class
 定数
   公開
    ↓
   内部
  変数
   公開
    ↓
   内部
 IBOutlet
   公開
    ↓
   内部
 OverrideMethod (ライフサイクルの順番は意識する)
 Method
   公開
    ↓
   内部
  IBAction

extension protocol
   自作
    ↓
   UIKit (UITableViewDelegateとか)

可読性のためにこのルールを守って書いてまs書きたいです

swiftのオプショナル型のnilチェックどうする?

[Swiftを書き始めたときに悩んだことシリーズ]

オプショナルのnilチェックをするときに、どっちの方法でやるのか悩みました。

書き方①

if let _ = optionalObject {
}


書き方②

if if optionalObject != nil {
}


書き方①の方が、っぽくて良いんだろうなーって思い、調査したら良いスライドを見つけました。
書き方①の方が、処理が早いので、書き方①を使っていこうと思います。
調べて、情報を共有してくれている方に感謝です。

Androidの消費型のアプリ内課金で「このアイテムは既に所有しています。」 と表示され購入できないAndroidの課金バグ

[Evernoteのメモシリーズ]

2016年6月頃にv3の消費型のアプリ内課金を実装中に遭遇したバグに関するメモです。

発生する状況

課金処理中に通信が切れ、 再度購入しようとすると 「このアイテムは既に所有しています。」 と表示され購入できない

f:id:ssktm:20171109204631p:plain

原因

GooglePlayクライアントがデバイス上に購入のキャッシュしているからです。デバイス上のGooglePlayに課金情報をキャッシュすることにより、APIの返答時間をスピードアップできますが、上記のような弊害もあるようです。
解決方法は、端末の再起動です。


このブログが仕組みを理解するのに参考になりました。
ありがとうございました!!!

他のアプリでもこのバグの対応として以下のような画面を用意しているのでこのバグで苦しんでいる人は、ヘルプページを作って誘導するようにしましょう!

対応①

対応②


このバグが現在あるかわかりませんが、誰かの手助けになればと思います。

swiftで[weak self]をguardするときの書き方ってどうするのが良いのだろう?

[Swiftを書き始めたときに悩んだことシリーズ]

今年の始めから本格的にiOSアプリを作り始めて、「swiftで[weak self]をguardするときの書き方ってどうするのが良いのだろう?`」って思いました。
調べたり、人に聞いたりすると以下のパターンがありました。(他にもあると思いますけど)

書き方①
guard let `self` = self else { return }
書き方②
guard let me = self else { return }
書き方③
guard let wSelf = self else { return }
書き方④
guard let strongSelf = self else { return }

自分は、書き方①を使っています。

理由
  • 別の変数名をつけたくない
  • シンタックスハイライトを有効にするため


エウレカのコーディング規約でも `self` にしているようです。


ただし、これはバグという情報も見つけました。。。



WWDC2017でAppleのエンジニアに知り合いが聞いたら、`self`でも問題ないということを言っていたので、大丈夫かなと思っています。

はじめに。

新卒で入社して3年が経ち、エンジニアとして「アウトプットが大事だなー」とより一層感じている日々です。


wordpressのブログに書いていた内容、今までのEvernoteのメモ、調査したことをつらつらと書いていこうと思います。
wordpressのブログは、お小遣い目的で作りましたが、全然書いてないし、稼げないのでcloseしました。


このブログの目的は、お小遣い稼ぎではなくて、「なんでもいいからアウトプットすること大事だな」精神で作りました。
仕事を通して学んだことをつらつらと書いていきます。

歴史

2014年新卒入社

研修(Java, html, css, javascript, Node.jsとか)

Android

Unity

angularjs(2週間)

Android

iOS

Androidが一番長くて、iOSは今年からやり始めました。
今は、iOSをやっているのでiOSの投稿が多そう。
研修、Unity、angularjsとかは忘れた...

(^^)