Quantcast
Browsing Latest Articles All 8 Live
Mark channel Not-Safe-For-Work? (0 votes)
Are you the publisher? or about this channel.
No ratings yet.
Articles:

IBOutletはなぜ" ! "で定義すべきか

背景

controlキーを押しながらstoryboardの部品とコードの紐付けを行うと接続のためのコードが生成されます。

@IBOutlet weak var myLabel: UILabel!

その際どうして"!"(暗黙的アンラップ型)で定義されるのか、疑問に思ったので調べました。

結論

1.IBOutletがnilになる可能性があるため、オプショナル型にする必要があるから。
2.コードをより簡潔に書くため、アンラップする手間を省く必要があるから。

では、それぞれの理由について詳しくみていきましょう。

オプショナル型にするのはなぜか

swiftの規約を参照してみましょう。

Classes and structures must set all of their stored properties to an appropriate initial value by the time an instance of that class or structure is created. Stored properties cannot be left in an indeterminate state.

あるクラスのインスタンスを生成するときには、すべての変数に値がセットされているか、nilであることを許容するオプショナル型にしておく必要があります。

例えば下記の場合。

class ViewController: UIViewController {

    @IBOutlet weak var myLabel: UILabel!

ViewControllerのインスタンスを生成するとき、Labelの値は確定していません。
そのため、値が入っていないこと(nil)を許容するオプショナル型にしておく必要があります。
たとえstoryboardと部品の紐付けをしていたとしても、オプショナル型にしていないとエラーになります。

これはなぜかというと、
1.ViewControllerのインスタンスを生成する
2.IBOutletを読み込む
という流れでXcodeが処理を行うからです。

そんなわけで、IBOutletはオプショナル型("?"か"!")で定義しないとエラーになってしまいます。

では"?"ではなく"!"で定義するのはなぜでしょうか。

アンラップする手間を省くとは

    @IBOutlet weak var myLabel: UILabel?

と定義することもできますが、後でアンラップするために書かなければいけないコードが増えます。

※ そもそもアンラップって何?という方は、この記事がわかりやすいと思います。
 どこよりも分かりやすいSwiftの"?"と"!"

storyboardの部品との接続を忘れていない限り
IBOutletには必ず値が入っているので、わざわざアンラップするのは面倒ですよね。

そのため、IBOutletは"?"ではなく"!"で定義します。

参照した記事

Should Outlets Be Optionals or Implicitly Unwrapped Optionals

CocoaPodsをプロジェクトから削除する方法

CocoaPods関連のファイルを一つ一つ削除する、というやり方をよく見かけるのですが、ちょっと面倒。
削除するファイルを間違えたりして、ビルドが通らなくなったらまた面倒。

バシッと一発で削除できるプラグインがあったので紹介します。

インストール

ターミナル
$ sudo gem install cocoapods-deintegrate

やってみよう

1.プロジェクトフォルダに移動
ターミナル
$ cd プロジェクト名
2.念のためプロジェクトのバックアップ
3.削除コマンド実行
ターミナル
$ pod deintegrate

ちなみにコマンド実行後も
Podfile, Podfile.lock, Workspace
ファイルは残ります。

Podfile, Podfile.lockはrmコマンドで削除できます。

ターミナル
$ rm Podfile

参照

https://github.com/CocoaPods/cocoapods-deintegrate
https://medium.com/@xwildeyes/remove-uninstall-deintegrate-cocoapods-from-your-xcode-ios-project-c4621cee5e42

[Xcode] シミュレータがデフォルトiPhone8 Plusで起動するのが嫌なとき

実機がiPhone8なので、デフォルトで選択されているデバイスを変更したかった。
テスト用のプロジェクトをばんばん作るので、毎回選択するのはめんどくさい。

ぐぐると、デフォルトであるデバイスにする設定画面はないらしい。(あったら教えてください)

結論

シミュレータ一覧からPlusを削除しちゃえばおk

Add Additional Simulators...を選択

スクリーンショット 2018-04-11 19.26.10.png

Show as run destinationのチェックを外す

スクリーンショット 2018-04-11 19.18.15.png

以上。

でも、たまにはPlusで動かしたいあなたへ

Xcodeのデバイス一覧からは消えますが、シミュレータのHardwareには残っているのでPlusで動かせなくなるわけではありません(^o^)
スクリーンショット 2018-04-11 19.22.39.png

産休中に娘を撮るためのカメラアプリをつくってみた

2月ごろから勉強始め、最近ようやくリリースできたのでプロセスを共有します😊
なにかお役に立てば幸いです。

つくったもの

名前と生年月日を登録すると、生後何ヶ月かが表示され撮影できるアプリ📷


⭐ダウンロードはこちら⭐

myスペック

swift:★☆☆☆☆(1/5)
デザイン:☆☆☆☆☆(0/5)

ものづくりをしたい気持ち:★★★★★(5/5)

1.基本の文法を学ぼう

プログラムはこうして作られる
Sunabaというオリジナル言語で0からテトリスをつくっていきます。
この環境でしか動かない言語なので回り道ではありますが、
「プログラムをどういう考え方で組んでいけばよいか」を学べたのでやってよかったです。

進め方はこんな感じでした↓
1.とにかく動くものをつくるため冗長なコードを書く
2.コードをきれいに書き直してみる
3.きれいにしすぎると可読性下がるので、ある程度でやめておく
4.1~3を繰り返し繰り返し…すこーしずつ機能を増やしていってよーやく完成

Swift

気に入ったサービスに課金してやり込むのもよさげ✊

Webサイト

Udemy
ドットインストール

iosアプリ

codebelle
Mimo

プログラミングも言語なので、外国語の勉強と同じように進めようと意識してました。
外国語:単語詰め込み→例文詰め込み→自分で話したいことを話せるようになる
swift:文法詰め込み→サンプルアプリ作成→自分で作りたいものを作れるようになる
勉強がしんどくても、その先の未来(パソコンと自在に会話し、つくりたいものをつくれるようになってる)をよく妄想していました😂

2.どんなアプリを作るか決めよう

自分が使いたい&なるべく他人も使ってくれそうなアプリを作りたかったので、
アプリストアを検索してマーケットの競争が激しすぎないかをみていました。
(例えばダイエットアプリも案にありましたが、アプリストアにたくさんの素敵なダイエットアプリがあり、わざわざ自分が作る必要ないわ😂と思ったためやめました)

3.コード書いてみよう

①Googleスプレッドシートに機能一覧を作成
②作れそうな機能から作る(もし作れなかったら翌日頭が冴えてからやりなおす)
③やり直しても作れなかった機能をカテキョで聞く
という流れで進めました。

1つ機能ができるごとにgitにあげてバージョン管理してましたが、前バージョンからコードコピペできてよかったです。

自分で納期を決めて、できない機能はがんがん削除してました。
それより今できる範囲で作れるものを作って、アウトプットしたかった✊

4.諦めない仕組みをつくろう

プログラミングがすごーく好きな人は違うのかもしれませんが
私の場合、アプリをリリースするまでにこんなアプリ、誰もつかわないんだぁあぁあ…やーめぴ💕という気持ちにたびたび襲われました。

あの宮崎駿さんでも制作活動をしながらめんどくさいめんどくさい言うそうなので、
プログラミングをめんどくさいと感じないくらい好きじゃないとアプリをつくっちゃだめなんだ
と思わないで、めんどくさくなっても継続する仕組みをつくるのが大事だと思います。

仲間をつくる

みんチャレ
現代版五人組。毎日やったことをメンバーに報告してました。
毎日やらないと「今日もやってないアイツ…」と思われるのが嫌で続けることができました(ネガティブ)
メンバーががんばってると刺激をもらえるのでよかったです(ポジティブ)

技術メンターをつくる

・違うクラスで複数インスタンスつくっちゃう😂
・画面遷移するときに遷移先のViewDidLoadでOutletが生成される前に、遷移元から呼び出しちゃってnilが入っちゃう😂
とか、とにかく1人じゃ解決できない場合。ggrksではあるものの、まじ無理なときってあります。
私は知り合いのエンジニアさんや、teachaで探した人にカテキョをお願いしました。

5.デザインもなんとなく整えよう

UI

アプリストアでカメラアプリをダウンロードしまくり、参考にしました。
ぱっと見でバランスを調整できるので、コードではなくオートレイアウトで部品を配置しました。

アプリアイコン

アプリの顔!なので妥協したくなくて、自分でラフを描いてイラストレーターさんに頼みました。
ランサーズでも探しましたがBtoBの案件が多めで個人開発アプリのイラスト作成を気軽に頼める雰囲気でなかったので笑、CtoC案件が多そうなココナラでよさそうな人を探しました。

色の組み合わせ

色合いの組み合わせが多数載っている書籍を買って、気に入った組み合わせを使いました。
xcodeですぐ設定できるように、色コードがのっている本を選んで正解でした◎
ちなみに配色アイディア手帳という本を買いました。使いよかったです。

終わりに

思っていた通りの機能が実装できたときのよろこびたるや✊

[swift] カメラロールの写真を選択して新しい画面で表示する

サンプル

カメラロール開く → 新規画面に選択した写真表示 → 閉じる という流れ。

showalbum2

コード

ViewController.swift
import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func toAlbum(){
        if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum) {
            let picker = UIImagePickerController()
            picker.sourceType = .photoLibrary
            picker.delegate = self
            self.present(picker, animated: true, completion: nil)
        }
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        let image = info[UIImagePickerControllerOriginalImage] as! UIImage

        let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let nextView = storyboard.instantiateViewController(withIdentifier: "Photo") as! PhotoViewController
        nextView.image = image

        self.dismiss(animated: false)
        present(nextView, animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}
PhotoViewController.swift
import UIKit

class PhotoViewController: UIViewController {

    var image: UIImage?

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        imageView.image = image
        imageView.contentMode = UIViewContentMode.scaleAspectFit
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func closeModal() {
        imageView.image = nil
        self.dismiss(animated: true, completion: nil)
    }

}

Storyboardで各ViewControllerのidentifierにMainPhotoを設定するのを忘れないように。

ダウンロード

githubに置いてあります。

swift4 - スワイプでtableviewのセル削除

実装

ViewController.swift
    //セルの編集許可
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool
    {
        return true
    }

    //スワイプしたセルを削除 ※arrayNameは変数名に変更してください
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == UITableViewCell.EditingStyle.delete {
            arrayName.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic)
        }
    }

 参考

https://qiita.com/Ryosuke-Hujisawa/items/cf00b02efc96b4330369

Sourcetreeの403エラーを解決した

前提

・Sourcetree & github連携
・Sourcetree version 3.0.1

やったこと

Sourcetree初コミットで403エラーが出たが、
リモートリポジトリのURLを変更することで解決した

before: https://lulu34@github.com/lulu34/HelloGit.git
※初期設定でURLの一部にユーザ名(lulu34@)が含まれていたため、削除
after: https://github.com/lulu34/HelloGit.git

↓のURL/パス欄の内容変更を行った
スクリーンショット 2019-01-15 0.31.10.png

参考

以下URLの順で設定していたらつまづいた・・・(すぐ解決してよかった)
https://qiita.com/naoki85/items/c7660d70347e9e70b201

storyboardをうっかり削除したとき復活させる方法

こんなときに使える

・xcode内でstoryboardの部品を消そうとしたら、うっかりファイルごと消してしまったとき
・うっかりGitにもあげてなかったとき

順序

・xcode左側のアプリ名の上で右クリック
・上から8番目のAdd Files to ”ファイル名”・・・をクリック
・Base.Iprojフォルダを開き、Main.storyboardを選び、Add

参考

https://teratail.com/questions/62934

Browsing Latest Articles All 8 Live