20201126のiOSに関する記事は6件です。

classとstructについて【Swift】

はじめに

classstructの違いについて理解が薄かったので、備忘録としての投稿させていただきます。

classstructの定義

structの場合

struct Human {
    let name: String
    let age: Int
}

classの場合

struct Human {
    let name: String
    let age: Int
    // プロパティを初期化しないと下記メッセージのように怒られます。
    // Class 'Human' has no initializers
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

classstructの使い分け

1. classstructの大きな違い

  • structは値型(継承できない、内部を直接書き換えることは不可)
  • classは参照型(継承できる、内部の書き換えるが可能)

2. structを使うパターン

  • 小さくて単純なデータをカプセル化をしたい場合
  • 参照渡しより値渡し(コピー)が良い場合
  • 継承が必要ない場合

3. structを使わない方が良いパターン

  • データが大きい
  • プロパティが多い

理由としては、以下の2つ

  • 構造体は変数にセットする度にコピーされるため、データが大きいと処理時間が遅くなる
  • 構造体はスタック領域に確保されるため、データが大きいと溢れる可能性が高くなる なので、APIやDBの取得データなどは構造体ではなく、クラスで作成したほうがよい。

4. 比較詳細

class struct
プロトコル実装  ○   ○ 
プロパティ(格納型)  ○   ○ 
プロパティ(算出型)  ○   ○ 
タイププロパティ(格納型)  ✕   ○ 
タイププロパティ(算出型)  ○   ○ 
メソッド  ○   ○ 
タイプメソッド  ○   ○ 

5. 補足

タイププロパティ

すべてのインスタンスが利用できる(C の static 定数のような)定数プロパティ、あるいは特定の型のすべてのインスタンスにグローバルな値を保管する(C の static 変数のような)変数プロパティのように、その型のすべてのインスタンスに共通の値を定義するのに役に立つ。

タイプメソッド

型自体で呼び出せるメソッド。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Xcode 12 + XcodegenでCycle Inside ______エラーでテストターゲットがビルド通らない問題

問題

Cycle inside <redacted>Tests; building could produce unreliable results. This usually can be resolved by moving the shell script phase '[CP] Embed Pods Frameworks' so that it runs before the build phase that depends on its outputs.
Cycle details:
→ Target '<redacted>Tests' has copy command from '/Applications/Xcode12.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/XCTAutomationSupport.framework' to '<redacted>/Library/Developer/Xcode/DerivedData/<redacted>-bxjgdjscysiavpfrzmquaqdkncsl/Build/Products/Debug-iphonesimulator/<redacted>.app/Frameworks/XCTAutomationSupport.framework'
○ Target '<redacted>Tests': CodeSign <redacted>/Library/Developer/Xcode/DerivedData/<redacted>-bxjgdjscysiavpfrzmquaqdkncsl/Build/Products/Debug-iphonesimulator/<redacted>.app/PlugIns/<redacted>Tests.xctest/Frameworks/CryptoSwift.framework
○ That command depends on command in Target '<redacted>Tests': script phase “[CP] Embed Pods Frameworks”

Xcode 12にアップデートした後にテストターゲット実行してみたら上記のエラーがでまくっていました?

色々調べてみて以下のStackOverflow issue見つかって
https://stackoverflow.com/questions/64556134/xctest-running-tests-fails-with-cycle-inside-x-building-could-produce-unreliab
なるほど〜ってなったけど。。。?

image.png

Xcodegenでプロジェクト生成しているためチェック外してもxcodegen走るたびに外さないといけなくなってしまう。。。

もしXcodegenでできる方法知っている方いたら教えて欲しいけど自分が探しても何もなくて以下の作戦で解決できました

フィックス

Xcodeproj to the rescue!
https://github.com/CocoaPods/Xcodeproj

こちらのスクリプトだけで簡単に外せた

require 'xcodeproj'
project_path = './Project.xcodeproj'
project = Xcodeproj::Project.open(project_path)

project.targets.select{ |target| target.name == "Unit Tests" }.each do |target|
    target.build_phases.select{ |phase| phase.display_name == "Embed Frameworks" }.each do |phase|
        phase.files.each do |file|
            file.settings["ATTRIBUTES"].delete("CodeSignOnCopy")
        end
    end
end

project.save()

これでブランチ切り替わった後に以下の感じでフックされるように設定
xcodegen generate
pod install
no-codesign-script.rb (なぜかpost-installに入れたら上手く行かなかった?)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PRPreviewViewControllerの再生が一回しかできない

ReplayKitでの画面収録をプレビューするPRPreviewView。
再生ボタンが最初の1回しか表示されない、と思ったら、モーダル表示した時に、再生・停止ボタンとActivityボタンが画面の下に切れてしまっていた。
フルスクリーンでモーダル表示すると、全部表示されます。

let sharedRecorder = RPScreenRecorder.shared()

..........


sharedRecorder.stopRecording(handler: { (previewViewController, error) in
    previewViewController?.previewControllerDelegate = self
    previewViewController?.modalPresentationStyle = .overFullScreen // このラインをプラス
    self.present(previewViewController!, animated: true) {
    }
})

?


お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

Twitter
Medium

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【第5回】初心者二人で0から麻雀アプリ開発

第4回はこちら

改版履歴

2020/11/26 投稿

第5回会議(2020年11月23日)

今回はいよいよ実装!……に入るための勉強会を実施しました。
これまでは個々に情報収集、学習を行なってきましたが、今回以降は足並みを揃える+毎週の学習時間確保を目的として、定例会議の場で学習した内容の共有をして行く予定です。

議題

  • プロジェクトの立ち上げ
  • ヘッダー・フッター表示
  • テーブル表示

形式

今回は最初の勉強会でしたので、どんな形式で、どのように進行したかを残しておこうと思います。

使用したツール

  • google meet
  • google スライド
  • Xcode

事前準備

  1. お互いに学習テーマを決める
  2. 一週間の間にテーマの調査・実装を行い、スライドにまとめる

当日

  1. 順番にスライド発表
  2. 質疑応答
  3. 課題点整理
  4. 次回のテーマ決定

勉強会

結論から言うと、実装についてはプロジェクト作成までしか実現出来ませんでした。
コンパイルエラーの解決は次週に持ち越しです……

今記事では、スライド発表後の課題点整理で挙がった内容を列挙します。

問題① 使用しているバージョンに対応した学習ソースがない

現在、本プロジェクトで使用しているバージョンは以下の通りです
swift: 5.3
Xcode: 12.2

特に、Xcodeは最近大きなアップデートがあり、開発画面のレイアウトが大きく変わってしまったようです。
過去の記事に書いてある内容を現在のバージョンで実現する操作がどれに当たるのか、という作業に難航しています。

問題② ライブラリに対する知識不足

第3回にて、iosSDKを使用すると漠然と決めましたが、上記のテーマを実現する方法は複数あることがわかってきました。
大きく、UIKit,swiftUI,オープンソースのライブラリを使っての実装が考えられますが、3者をあまり区別なく調査している状況です。

そのため、実装に対する共通認識を持ちづらく、お互いの調査結果についてレビューしづらいという弊害がでています。

共同開発をする上でも、基本の画面や、共通部に使用するライブラリは揃えていく必要がありそうです。

エラーの原因がわからない

これは特にswiftUIでの実装にいえるのですが、コンパイルエラーの箇所やエラーメッセージについて、英文でわかりづらい、翻訳を駆使しても原因の特定にじかんがかかってしまう。
また、エラーの直接原因が、エラーが出ている個所でない場合があり、特定できない。

などです。

根本的な基礎知識が不足しているのが原因ではありますが、現在の学習方法では上記の問題を解決しづらいのではないかと考えています。

詰まった場合の解決策をまとめておく等の対応が必要かもしれません。

おわりに

今回は一回目の勉強会についてお送りしました。
本来は、勉強会の成果を本記事でアウトプットしていくのがよいとは思っていますが、一記事になるほどのネタがありませんでした……

次回以降、投稿内容等も含めて、課題を消化していきたいと思います。
(会議の全体概要を投稿していくのではなく、勉強会の一部分をピックアップしてまとめるというスタイルでもいいかもしれません。ネタがあればですが。)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

モバイル新OSリリース前後の試験を考察する (iOS編)

iOS、AndroidのOSはほぼ毎年、メジャーバージョンアップが行われる。2020年を振り返るとAndroid11が9月8日に、iOS14が9月16日(日本時間9月17日)にリリースされたのだが、モバイルアプリ開発に携わっている者として、新OSへの対応は非常に頭の痛い課題である。
公開中のアプリの画面のレイアウトがおかしくなる、特定の機能が使えなくなる、最悪のケースではアプリが全く起動しない…といった事態も起こり得るため、事前の動作検証は必要不可欠である。

今回はiOS14に関して。Android11については後日。

iOSのOSアップデートに関するユーザー動向

以下はとあるアプリのiOSプラットフォームごとのユーザー比率である。
(AppStoreConnect アクティブなデバイス数 を集計)
ios14_user.png

  • iOS14.0公開の翌日には5.6%
  • iOS14.0公開の1週間後には20.0%
  • iOS14.0公開の45日後に50%を突破
  • 11月末時点では86.8%

となっていた。なんだ、翌日はたったの5.6%か…と思うかもしれないが、仮に10万ユーザーが利用するアプリなら5,600人。万が一、致命的な不具合が出てしまったら、ユーザーサポートへのクレーム電話(メール対応かもしれないが…)が殺到しかねない事態になる。マジでヤバい。

じゃあいつテストをすべきか?

ということだが、iOS14の公開直後に不具合に気づいて即座に修正に取り掛かり、アプリのアップデート申請ができたとしても恐らく2~3日程度。だが、10万ユーザーが使うような商用アプリで、ここまで迅速な対応ができるモノは果たしてどれくらいあるだろうか? もし、これくらいの対応は余裕だぜ! と言えるプロジェクトに参画している方は、その対応の速さには誇リを持って良いだろう。

まぁ…1週間や10日、中にはアップデート申請の開発~社内承認には1ヶ月くらいかかるよ…というプロジェクトも当然あるはず。なので、とりあえず正式版の公開がされる(と予想される)1ヶ月程度前にベータ版でテストをしてアタリをつけておく…という方針が良いのではないかと思われる。なお、iOSの正式な公開日は、だいたい9月の中旬ごろであるが、直前まで情報が公開されないため、9月8日かな? 15日かな?と想像して動くしか無い。

また、ベータ版、特に早期の段階ではOSの動作が不安定だったり、仕様が変わる可能性もあるので、待てる限り待つ、しかし対応が後手にならない線でテストをするのがベストである。

iOS14のOSアップデートを振り返る

過去のiOS beta版の配信スケジュールは、@enomotok さんが以下にまとめてくれているので、そちらを参考にしていただきたい。(非常に重宝しました。ありがとうございます!)
https://qiita.com/enomotok/items/696b10866e33303ab3d4

  • iOS13 GM版 2019/9/10 → 正式版 2019/9/24 (14日後)
  • iOS12 GM版 2018/9/12 → 正式版 2018/9/17 (5日後)
  • iOS11 GM版 2017/9/12 → 正式版 2017/9/19 (7日後)

オレたちは3日でアップデートをリリースできるぜ! という稀有なプロジェクトなら、例年はGM版(最終版)で検証すればよいはずだったものの、iOS14はどうだったかというと…

  • iOS14 GM版 2020/9/15 → 正式版 2020/9/16 (翌日)

はい、これは無理でした。何か起きていたら絶対に間に合いませんでした!
(beta4の時点で、見切り発車しておいて正解でした)

2020年の教訓:GM版を待つのはやめよう!

来年のiOS15はどうなることやら…修羅場にならないよう早め早めに検証は実施しよう!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[iOS13]DeprecatedになったkeyWindowの取得方法

環境

  • Xcode 12.1
  • Swift 5.3

概要

UIApplication のプロパティである KeyWindow
iOS13.0でDeprecatedになっていたので取得方法を修正する必要があります。
Apple公式ドキュメント - keyWindow

(今更ですが)

取得方法

修正前

UIApplication.shared.keyWindow

修正後

UIApplication.shared.windows.first { $0.isKeyWindow }

参照: stack overflow

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む