20210118のSwiftに関する記事は4件です。

[Swift]定数と変数

[Swift]定数と変数

定数と変数は値の一時的な保存に使います。
処理の結果を保存することによって、後続の処理で再利用できます。
変数は値の再代入が可能ですが、定数は一度代入したら値を変更することはできません。

宣言方法

変数はvarで定数はletを使います。

var 変数名:型名
let 変数名:型名

変数名aとbに3を代入します。
Int型で宣言します。

var a:Int=3
let b:Int=3

値の代入方法

次に、aとbに1を代入します。

a=1//1
b=1//コンパイルエラー

結果を見たら一目瞭然ですが、aに1を代入することは可能ですが,bに1を代入することはできません。

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

Swift Firebaseを使ってみよう FirebaseAuth編

FirebaseAuth導入

※この記事ではFirebaseコンソールでの設定は終わっているものとしています。
まずはターミナルを開いてプロジェクトに移動しましょう。

cd /Users/[ユーザー名]/Desktop/[プロジェクト名]/

移動ができているか心配の方はpwdコマンドを実行してください。
移動したらポッドファイルの作成をします。

pod init

コマンドを実行するとpodfileが作成されています。
確認方法はlsコマンドを実行しましょう。
ちゃんと作成されていたら

open podfile

でファイルを開きます。
開いたらこんな感じに編集してください。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'FirebaseTest' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for FirebaseTest
  // 追加
  pod 'Firebase/Auth'
end

もう一度ターミナルに戻ります。
戻ったら次のコマンドを打ちます。

pod intall

これでFirebaseAuthが使えるようになります。

使ってみよう 新規ユーザー登録編

ターミナルで

open [プロジェクト名].xcworkspace

と打ってください。
Finderから開いても大丈夫です。
拡張子が.xcodeprojじゃなくて.xcworkspaceですので間違えないようにしてください。
開いたらViewControllerの編集をしましょう。

ViewController.swift
class ViewController: UIViewController {

    private var emailFiled = UITextField()
    private var passwordField = UITextField()
    private let authButton: UIButton = {
        let button = UIButton()
        button.setTitle("登録", for: .normal)
        return button
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        emailFiled = initField(placeholder: "email")
        passwordField = initField(placeholder: "password")
        authButton.addTarget(self, action: #selector(didTapAuthButton), for: .touchUpInside)

        view.addSubview(emailFiled)
        view.addSubview(passwordField)
        view.addSubview(authButton)
        emailFiled.frame = .init(x: 50, y: 100, width: view.frame.size.width-100, height: 40)
        passwordField.frame = .init(x: 50, y: 160, width: view.frame.size.width-100, height: 40)
        authButton.frame = .init(x: 50, y: 220, width: view.frame.size.width-100, height: 40)
    }

    @objc func didTapAuthButton() {

    }

    private func initField(placeholder: String) -> UITextField {
        let field = UITextField()
        field.placeholder = placeholder
        field.autocorrectionType = .no
        field.autocapitalizationType = .none
        field.layer.borderWidth = 1
        field.layer.borderColor = UIColor.black.cgColor
        if placeholder == "password" {
            // 入力した文字を隠す
            field.isSecureTextEntry = true
        }
        return field
    }
}

こんな感じにViewを設定しましょう。
さあ、お待たせしました。
FirebaseAuthを使っていきます。
didTapAuthButtonの中に処理を書いていきます。
変更点だけ書きます。

import FirebaseAuth

class ViewController: UIViewController {
    @objc func didTapAuthButton() {
        guard let email = emailFiled.text, let password = passwordField.text else {return}
        Auth.auth().createUser(withEmail: email, password: password) { (result, err) in
            guard let user = result?.user, err == nil else {
                print("error: ", err!)
                return
            }
            let userEmail = user.email
            print("email: ", userEmail ?? "")
        }
    }
}

新しくユーザーを作成するのはたったのこれだけ
なんならcreateUserの後に実行したい処理がなければAuth.auth().createUser(withEmail: email, password: password)だけで済みます。
まあクロージャの中身空にしたまま使うことなんてほぼないと思いますけど。

使ってみよう ログイン・ログアウト編

ログインも早速コードをみてみましょう。

@objc func didTapAuthButton() {
        guard let email = emailFiled.text, let password = passwordField.text else {return}
        Auth.auth().signIn(withEmail: email, password: password)
}

これだけでログイン機能ができます。めっちゃ簡単ですね。

ログアウト機能もこんな感じでできます。

@objc func didTapAuthButton() {
        do {
            try Auth.auth().signOut()
        } catch(let err) {
            print(err)
        }
}

ログアウトは例外処理が発生しますので例外処理って何?って思う方はこちらを参照してください。
Swift 4.0 エラー処理入門

他にも電話番号でログインしたりする機能も簡単に実装できるので調べてみてください。
今回はここまで。

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

はじめてのSwiftLint

「SwiftLintをそろそろ導入してみましょう」
とアドバイスを頂いたので、挑戦してみました!

こんな方向けの記事

・Swiftを始めて何もかもよくわからない
・でもなんとなく少しはわかるようになった

SwiftLintってなに?

SwiftLintは、「swiftの静的解析ツール」だそうです。
静的解析ってなに??

今さら聞けない「動的テスト」「静的テスト」とは?
なるほど。
機会的にチェックしてくれる、ツールってことですね。
どうやら、機会的にチェックするが故に指摘項目も多くなる、とのことです。

さてやってみましょう。

実際にやってみました

SwiftLintの導入には、
Mint,Homebrew,CocoaPodsのどれかが使える環境が必要なように感じました。
「ああ、なんだよ、それ。それから調べないとじゃん」と思っていましたが、
サロンの大先輩が、こっちでやるのが一番簡単だよ、とのことで、
教えてくれた通りに実施してみました。

まず、SwiftLintの在処へアクセス。
1.png

当たり前ですが、全部英語です。
そのうち慣れると思っていますが、よちよちは「ひえぇぇえええ」ってなりますよね。
私はなりました。

スクロールして、少し下の方に行くと、
2.png
「Using a pre-built package:」の箇所があります。
上図の英語たちをグーグル翻訳に頼ってみますと

ビルド済みパッケージの使用:

最新のGitHubリリースSwiftLint.pkgからダウンロードして 実行することにより、SwiftLintをインストールすることもできます。

と、翻訳されました。
ふむふむ。
リンクをクリックして、「SwiftLint.pkg」とやらをダウンロードすればいいのかな。
早速、やってみます。
リンクをクリックすると
スクリーンショット 2021-01-18 21.33.03.png
英語のページに飛びました。
ここから、下にスクロールしていくと、見つけました!!
3-SwiftLintpkg.png

「SwiftLint.pkg」をクリックします。
ダウンロードに5分くらいかかるので、ここでちょっと休憩。
ダウンロードが終わり、ダウンロードのフォルダからダブルクリックで解凍しようとすると、
「これは確認取れてないやつなんで、開けません」的な注意喚起が出てきます。

ふふふ。私は、もうそこでは躓かないぞ。(過去に体験済)
Finderから、ダウンロードフォルダに行って、
コントロールを押しながら開く.png

該当の「SwiftLint.pkg」を「control」を押しながらクリック。
そうすると、開くのところが出てくるので通常通りそのままクリック。
そうすると、さっきとは違う注意喚起が出てきます。
5.png

「ええ。もちろん、開きますとも。」
これはイケナイことですが、「みんなが使っているから大丈夫!」という
情弱丸出しの現状で、なんの疑いもなく「開く」をクリックします。
仕方ありません、初学者です。
いつかはちゃんと根拠を持った判断ができるようになると信じています。

さて、次に検証してみたい(実験に使えそうな)プロジェクトを立ち上げてみます。
プロジェクトの一番上のフォルダを選択して、このような画面を開きます。
スクリーンショット 2021-01-18 21.41.24.png
そうすると、このプロジェクトの概要的なところが映し出されますので、
上のメニューバー
スクリーンショット 2021-01-18 21.43.08.png
こちらの「Build Phases」を開きます。
ビルドフェーズと読むそうです。
上の図の左下にある「+」ののところをクリックして、
「New Run Script Phase」をクリックします。

そしたら、Run Scriptのところに、
コードが書けそうな場所が現れます。
そこに、下記のコードをコピペします。

if which swiftlint >/dev/null; then
  swiftlint
else
  echo "SwiftLint does not exist, download from https://github.com/realm/SwiftLint"
fi

そして、そのまま「⌘+B」!!

すると、どうでしょう!!
SwiftLintのないときは、数個のエラーだったこのプロジェクトが!!

スクリーンショット 2021-01-18 21.53.02.png

44個のissuesを発掘しました!!

薄々は気づいてましたよ。
レイアウトに問題があることを…。
iPhone11でビルドしたときはいいけど、iPodでビルドしたら
レイアウト、くっそ崩れてましたもんね・・・

と、いうことで、根気強くこれらのイシューさんを開拓していこうか、と思いました。
イシュー多すぎて睡魔に襲われたので、明日にします…。

わからなかったこと!!

・これ毎回コピペするの??最初から、Xcodeに取り込んで置くことはできないの?
・このWarningのエラー文を簡単に翻訳する方法はないの??

まぁ、英語に慣れろってことですよね。
エラーの表示も設定でカスタムできるみたいですね。
もう少し、使って調べてみて、より良い使い方を身につけたいと思いました。

今日はここまで。

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

SwiftUIで作るしりとり地図アプリ

iosアプリ開発を学ぶために、位置情報を組み合わせたしりとりアプリを作成しました。
https://apps.apple.com/app/id1537582064#?platform=iphone

なんで作ろうと思ったか

モバイルアプリ開発のスキルを身につけるために、すぐに作れるチュートリアル的なものを作ろうと思って作りました。しりとりをするだけのアプリなら1ヶ月くらいで終わるだろうと思って始めたのですが、半年もかかる壮大なプロジェクトになってしまいました。

利用技術

  • フロント: SwiftUI
  • バックエンド: Firebase  

発表されたばかりで目新しかったというだけの理由で、SwiftUIを利用しました。
Swiftそのものを触ったことがない、かつ成熟していない技術のため調べるのが難しいので大変でした。バックエンドはFirebaseのFirestoreとFunctionを活用しました。

完成図

回答画面

しりとりを回答して送信する画面。
しりとりになっていなかったり、英数字が入力されたりするとバリデーションがかかる。

地図画面

しりとりの入力場所を地図上に表示する画面。本アプリの目玉。回答地点のピン間をアニメーションで繋いだのがポイント。

履歴画面

これまでのしりとり経歴を表示する。自分の回答のみフィルタすることも可能。

工夫したこと

非同期通信

DBにFirestoreを利用することで、しりとりデータの回答送受信を非同期通信で実現することができました。回答を送信した後、更新ボタンなど押すことなく地図画面、履歴画面の内容が更新されます更新されます。
(一方トランザクションは考慮されていないので、複数人が同時に送信した時の挙動が不安定...)

しりとり選択時の地図表示

地図表示にはSwiftUIではなく、SwiftのMapkitを利用しています。ピッカーで選択されたしりとりを地図上に表示させるために、MapkitとSwiftUIの状態変数をバインディングさせてるのが大変でした。

位置情報データ利用におけるプライバシー配慮

位置情報データを利用するにあたってユーザーからきちんと利用同意をとる必要があり、きちんとできていないとAppStoreのレビューで信じられないくらい怒られます。
実はここが一番苦労したところで、下記の機能を実装することでクリアしました。
1. 利用規約同意
2. 投稿時に位置情報を非公開にする機能
3. 既に投稿したしりとりの位置情報を非公開に変更する機能
アプリにとってはいわば非機能部分の実装ですが、何気にかなり時間がかかりました。

感想

開発に行き詰まるたびに、「このアプリは何のためにあるのだろう」という気持ちが頭をよぎり、モチベーションを維持するのが大変でしたが、なんとかアプリリリースまで漕ぎ着けてよかったです。
技術を身につけるために個人開発をするのはとてもためになりますが、役に立つもの、モチベーションが上がるものを作ることが何よりも大事だなあとしみじみ思います。
一緒に開発していただいた@antyuntyuntyun さんにこの場を借りて感謝申し上げます。

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