平々凡々エンジニア

平凡で難しい悩みを解決

swift InitとDeinit

Init

これは他の言語でも同じ感じでクラスをインスタンス 化した時に呼ばれるメソッド

Deinit

これはデニシャライズ読みます。 インスタンス が破棄された時に行われるメソッドです。 使い所としてはあまりないと思うがファイルを扱うクラスで、開いたファイルをインスタンスの破棄時に確実に閉じるために使用したりすると便利です。

循環参照とは

経緯

僕はswiftのクロージャーを安易に使って循環参照を行ってしまいました。 その時にこの言葉を知らなかったため検索できずハマってしまったので記録しておきます。

循環参照とは

メソッドAはメソッドBを呼び出します。 メソッドBはメソッドAを呼び出します。 そしてこれが無限に続くことになります。 この参照が回ってしまうことを循環参照というわけですね。

循環参照が起きてしまうパターン

何が問題なのか?

  • エラーを吐かないことでしょう
  • 無限に回ってしまうので無限にメモリを消費してしまう
  • システムが止まらない

解決策

  • そもそもクロージャーなどのイベントフックを多用しない
  • オブジェクトごとにちゃんと分けてスパゲッティーにしない
  • 静的解析ツールを使用する

雑談

単語は結構検索するけどイマイチ定着しないことがおおいいです。 今回のように循環参照という言葉は言われればなんとなく意味がわかるけど 普段使ってない言葉なのですぐに言葉が思い出せない。 なので今度から単語もブログに書いていこうと思う。

初めてphp やったことまとめてみた

docs.google.com

 

昔はこういう資料は全部gitで管理してたけど見にくいしアクセスしづらいからこっちの方がいいと思いました。

というかGoogleのこのドキュメントやエクセル の機能すごく使いやすくてもうオフィスいらないまであると感じてます。

phpを初めて触ってみた

github.com

 

本当にまっさらな状態です。

php 7

apach 2

mysql 

centos 8

lamp環境というやつですね。

フレームワークは一切使ってません。

主にセッションの勉強とページングの勉強をしました。

ログインとログアウト、ユーザー登録、ユーザー一覧表示を作成しました。

ページングはフレームワークを使用したら一瞬で終わるんだろうなぁと思うほどめんどくさかったです。

勉強はほとんど終わったので次はフレームワークを触りたいと思います。

OAuth わかりやすい資料見つけた

qiita.com

 

超わかりやすくて特に自分が補足できるようなものはないです。

ちなみにOAuthのできた背景は

Webサービスの連携が増えたため情報共有が問題となってた→

OpenIDのような連合アイデンティティが解決策として登場した→

しかしこれはIDの持ち主による 認証でリソースアクセス認可を扱えない→

webAからwebBに連携する方がいいよね→

OAuth誕生

てな感じです。

まだまだ残業地獄の時にブログに残したい資料を貯めたのが残っているので毎日少しづつでいいので書いていきたいです

swiftのクロージャ

クロージャとは

自分を囲むスコープにある変数を参照する関数 Swiftは第一級関数をもつ。関数そのものを型に指定できたり、関数をインスタンス化します。 関数に名前がない無名関数としても定義することも可能です。

使い方

//雛形
{(引数名1: 型, 引数名2:...) -> 戻り値の型 in
  クロージャの実行時に実行される文
 必要に応じてreturn文で戻り値を返却する
}

//サンプルコード1(処理内容1文)
let double = { (x: Int) -> Int in
  x * 2
}
double(2)

//実行結果
4

//サンプルコード2(処理内容2文以上)
var plus = { (x: Int) -> Int in
    var y = 0
    y += x
    return x + y
}
plus(3)

//実行結果
6
3

使い所としては変数や引数に関数の中身を直接代入できるので、グローバル変数の削減やや関数の実行結果を次の処理で続けて使用する関数を作成したい場合に使用できます。名前が不要であったり、型推論してくれるので関数定義よりも軽く定義できます。

自分はあまり使わないけど... defer

defer とは

スコープを抜け出すときに実行するもの

func deferTest() {

    let arrayData = ["red", "blue", "yellow", "pink"]

    for data in arrayData {
        defer {
            print("defer文実行")
        }

        if data == "blue" {
            print("スコープを抜けます")
            break
        }

        print(data)
    }
}
deferTest()

// 【結果】
// red
// defer文実行
// スコープを抜けます
// defer文実行

注意

defer前にreturnやbreakしてしまうと実行されない

func deferTest(param: String) {

    if param == "blue" {
        print("スコープを抜けます")
        return
    }
    // このdeferは実行されない
    defer {
        print("defer文実行")
    }
}
deferTest(param: "blue")

// 【結果】
// スコープを抜けます

社内でよく使う人がいたので必然的に覚えました。 しかし可読性には問題なくてもコード読んでる最中に忘れてしまうことがあったのであまり好きにはなれませんでした。