2020/01/08 実務で学んだこと

【実務で学んだこと】 Diary

その日に覚えたこと、学んだこと、知ったこと、気になったこと等を日記のように書いていきます。

今回は 2020/01/08(水)に学んだことを書いていきます。

【Swift】

mapとfilterについて

まず、mapとfilterについて簡単に。

  • map : 要素の数だけ順番に処理を繰り返し、その処理を実行した値を配列にする
  • filter : 要素の数だけ順番に処理を繰り返し、その処理の条件にあった要素のみを取り出す

map

mapは全要素に処理を適用したいときに使います。

let numbers = [1, 2, 3, 4]
let newNumbers = numbers.map { $0 + 2 }
newNumbers  // [3, 4, 5, 6]

filter

filterは条件に合う要素を絞り込むときに使います。

let numbers = [1, 2, 3, 4]
let newNumbers = numbers.filter { $0 % 2 == 0 }
newNumbers  // [2, 4]

参考記事

Structの作成

Struct(構造体)を作成する時は、基本的にはクラスと同様です。

struct SampleStruct {
    var hoge: 型
    let fuga: 型
}

以下はStructとClassの違いです。

StructClass
値型参照型
継承できない継承できる

Swiftでは基本的にStructを使用し、継承が必要な場合や参照型が良い場合のときにClassを使用するのが良いそうです。

参考記事

mutatingキーワードについて

StructやEnumのような値型では、自身の値を変更する場合には、メソッドの宣言にmutatingキーワードをつける必要があります。

mutatingキーワードが指定されたメソッドを実行してインスタンスの値を変更すると、インスタンスが格納されている変数への暗黙的な再代入が行われます。

mutatingキーワードが指定されたメソッドの呼び出しは再代入として扱われるので、定数に格納された値型のインスタンスに対しては実行できずにコンパイルエラーとなります。

// 以下のコードは「Swift実践入門」6.2からの引用です

extension Int {
    mutating func increment() {
        self += 1
    }
}

var a = 1  // 1
a.increment()  // 2(aに再代入が行われている)

let b = 1
b.increment()  // bに再代入できないためコンパイルエラー

Structの場合は、ストアドプロパティを変更する場合にもmutatingキーワードが必要になります。

struct SampleStruct {
    var count: Int

    init(count: Int) {
        self.count = count
    }

    mutating func countUP() {
        self.count += 1
    }
}

// letで宣言するとコンパイルエラーとなる
var sampleStruct = SampleStruct(count: 1)
sampleStruct.countUP()
sampleStruct.count  // 2

参考記事

XcodeのFixで変数が _ に修正される

これは、Xcodeが関数の戻り値を _(ワイルドカード)への代入によって明示的に戻り値を無視することで、警告を抑制するというものでした。

通常、戻り値のある関数を呼び出す場合は、変数や定数に代入します。

戻り値の代入を省略するとコンパイルエラーとなります。

関数の戻り値の代入を省略するとコンパイルエラーとなる

しかし、関数の戻り値に変数を宣言すると、Xcodeによって以下のような黄色いアラートが出るときがありました。

アラートが出ている画像
Initialization of immutable value 'a' was never used; consider replacing with assignment to '_' or removing it

Replace 'let a' with '_'

そしてFixをすると、Xcodeが変数を_に変更するのですが、これの意味が今までわかりませんでした。

_ に変換された画像

これは宣言した変数(関数の戻り値)が使用されていないので、変数を宣言する意味がない(関数の戻り値が不要となる)ため、 _ に変えて明示的に変数を使用しない(戻り値を無視する)というものです。

// 以下のコードは「Swift実践入門」6.2からの引用です

func functionWithDiscardableResult() -> String {
    return "Discardable"
}

_ = functionWithDiscardableResult()  // "Discardable"

もしくは、戻り値の使用を必須としない場合は、関数にdiscardableResult属性を付与することで警告を抑制することができます。

関数に @discadableResult 属性を付与して警告を抑制する

Playgroundで実行しても戻り値が評価されて右のエリアに表示されるため警告は発生しません。

参考記事

画像(UIImage)の色を変更する

ボタンなどの画像の色を変更したい時はコードやstoryboard上で変更することが可能です。

ボタンなどの画像の色を変更したい時はコードやstoryboard上で変更することが可能です。

storyboard上で変更する場合

1. Assets.xcassetsから色を変更したい画像を選択する

1. Assets.xcassetsから色を変更したい画像を選択する

2.Attribute InspectorのRender Asを[ Template Image ]に変更する

2.Attribute InspectorのRender Asを[ Template Image ]に変更する

3.storyboard上のTint Colorで任意の色に変更する

3.storyboard上のTint Colorで任意の色に変更する

コードで実装

IBOutletで画像を取得し、以下の設定することで色の変更が可能となります。

import UIKit

class viewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // RenderingModeをalwaysTemplateに変更
        let lightImage = UIImage(named: "豆電球")?.withRenderingMode(.alwaysTemplate)
        // imageViewに画像を代入
        imageView.image = lightImage
        // imageViewのtintColorを任意の色に変更
        imageView.tintColor = .yellow
    }
}

ちゃんと色が変更されていました。

参考記事

【Rails】

数値フィールドのフォームヘルパーの使い方

Railsのフォームヘルパーはよく使用するのですが、改めてnumber_fieldの使い方を復習しました。

かといって特に変わった書き方はなく、text_fieldなどとあまり変わりません。

<%= number_field(:product, :price, in: 1.0..20.0, step: 0.5) %>

上記の出力はHTMLであれば以下のようになります。

<input id="product_price" max="20.0" min="1.0" name="product[price]" step="0.5" type="number" />

このフォームヘルパーによって数値フィールドが簡単に使用できます。

参考記事

【HTML/CSS】

数値の入力欄の作成と指定可能な属性について

railsで数値フィールドを簡単に作っても、そもそもHTMLだとどんな属性があるのかがよくわかっていませんでした。

参考記事をみて色々試してみるとわかると思います。

参考記事

数値の入力欄に表示されるスピンボタンを非表示にする方法

数値フィールドはデフォルトでスピンボタン(数値の増減ボタン)が付いています。

これを非表示にしたいと思ったのですが、HTMLにはそういった属性は無いです。

なので、以下のCSSによって非表示にすることができました。

/* Chrome, Safari */
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}

/* FireFox, IE */
input[type="number"] {
  -moz-appearance:textfield;
}

参考記事