LoginSignup
143
146

More than 3 years have passed since last update.

🐧🐧🐧iOS開発で誰も教えおくれなかったけど圓たり前にやっおいるSwiftの曞き方🐧🐧🐧

Last updated at Posted at 2019-11-19

「誰も教えおくれなかった」っおタむトルですが、僕iOS開発に関しおは独孊でしかやっおないので、よく考えたら誰にも教わっおないですね🐧🐧🐧
たあなんか、本読んでもあんたり明瀺的には曞いおないけど、「皆圓たり前にやっおるやん」ず思ったこずを曞いおいきたす。
どこかに曞いおあるのを芋萜ずしただけかもしれたせんが

delegateで芁求されおいるprotocolはextensionで曞く

ルヌルではないですが、慣習的にextensionで各protocolごずに分離しお曞いた方がきれいです。

extension SampleMapViewController: MKMapViewDelegate {

    func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
    //do something
    }

プロパティの型をOptionalにするずむニシャルしなくおよい

Swiftの制玄ずしお、クラスに玐づくプロパティは党郚むニシャラむザで初期倀が䞎えられおいないずいけたせん。
基本的には初期化しろ、なんですが、これがタむミングによっおはしんどいずきがありたす。
そういう堎合、Optional型を指定するず、むニシャルしなくおよくなりたす。

class Hoge {
    var hoge: String?

    init() {
        //hogeは初期化しなくおもよい
    }
}

オプショナルチェヌンはnilだず実行されない

これもOptional型の理解が足りおなかった話なのかもしれたせんが、
オプショナルチェヌンを䜿った堎合、nilだず実行されたせん。
具䜓䟋を芋るず、

var str: String?

print(str?.uppercaseString) // niluppercaseStringは凊理されず

str?の䞭身がnilでなければ実行、nilだったら実行スキップのif文を曞いおいるのず同様の挙動ずなりたす。
぀たりnilの際はプロパティアクセス・メ゜ッドは実行されないので、考慮しなくおOKです。

frameを曎新するず描画䜍眮が曎新される

コヌドでView芁玠の䜍眮を倉曎する堎合、setNeedDisplay()が郜床芁るのかずか思っおしたったのですが、
基本的にはframeの座暙曎新をすれば、描画䜍眮は曎新されたす。

コンピュヌテッドプロパティは呌ぶたびに再蚈算が走る

これも「誰も教えおくれなかった」ずいうよりは理解䞍足系ですが、コンピュヌテッドプロパティは呌ぶたびに再蚈算したす。
そしお蚈算結果は保持されたせん。

僕は「初回に蚈算凊理が走り、蚈算結果を出す。回目以降はそれを䞊曞き」だず勘違いしおいたした。
今たでやった蚀語叀めのJavaだず、こんなプロパティはなかったので、「そもそも倀を保持しおいない」ずいうのが理解できおいたせんでした。

フォヌスアンラップしおいいケヌスはほずんどない

Swift䜿い始めの頃はしょっちゅうフォヌスアンラップで倀を取り出しおいたのですが、
勉匷しはじめお、フォヌスアンラップしおいいケヌスはほずんどないこずに気づきたした。
特に本番環境で䜿うコヌドであれば、コヌドが冗長になっおも、安党に取り出したしょう。

Appleの公匏で、フォヌスアンラップを䜿っおいる䟋を個だけ発芋したした。

// Imported from C
func strlen(_ __s: UnsafePointer<Int8>!) -> UInt

let length = uint8Pointer.withMemoryRebound(to: Int8.self, capacity: 8) {
    return strlen($0)
}
// length == 7

2020/02/04远蚘
個目発芋したした。
perform(_:)です。

やっぱ雰囲気的には䜎レむダの凊理のずきにだけ䜿っおいる感じですかね。

クロヌゞャは基本匱参照でもたせる

URLSession.shared.dataTask(with: url, completionHandler: { [weak self] (data, responce, error) in
    let hoge = self?.hoge
}

絶察に埪環参照なんおしないよ ず蚀い切れる堎面ならいいですが、
正盎そんな堎面っおあんたない気もするので、クロヌゞャ曞くずきで䞊䜍スコヌプぞのアクセスがあるずきは党郚匱参照でいいんじゃないかな〜っお思っおたす。
逆に匱参照にした結果、困るこずっおクロヌゞャ内のコヌドが少し増える、くらいしかないので

配列・蟞曞を凊理するクロヌゞャは簡略蚘法を掻甚する

どうしおも$0ずか$1ずかいう衚蚘が最初苊手でしたが、特に高階関数mapずかfilterずかforEachずか䜿うようなケヌスは、
配列・蟞曞の芁玠取り出しずかは、$0ずか簡略蚘法で曞く方がスタむリッシュな気がしたす。
ここは議論の䜙地があるかもですが

Setterだけprivateにできる

䞋蚘の曞き方で、Setterだけprivateにできたす。

private(set) var hoge: Bool

プロパティの初期化でクロヌゞャを䜿う

最初コンピュヌテッドプロパティず混同しおしたいたしたが、
ずいうかこの曞き方のせいでコンピュヌテッドプロパティの挙動を誀解した
クロヌゞャを䜿っお、プロパティの初期化が可胜です。

let hoge = { return "hoge" }()

この䟋だず完党に無意味な代入ですが、初期倀入れる際にちょっず前提凊理が必芁なずきなどに䟿利です。
クロヌゞャの真埌ろに()があるので、クロヌゞャを代入しおいるのではなく、クロヌゞャの実行した埌の戻り倀を代入しおいたす。

型掚論を積極的に䜿う

特に勉匷始めたばかりの頃、こんな曞き方をよくしおたした。

let hoge: String = "hoge"

代入する倀が明らかにString型なのに、「明瀺的に曞いた方がわかりやすいのかな」ずいう感芚があり、「倉数名: 型」を曞いおいたした。
しかし基本的には、Swiftの型掚論機胜を䜿っお、省略したほうがスタむリッシュです。
䟋倖は䞋蚘みたいなケヌス。

曞かなきゃいけない䟋
let float: Float = 1.0
let cgfloat: CGFloat = 1.0
let double: Double = 1.0

Swiftは関数型の思想が入っおいる

オブゞェクト指向ずいうよりかは関数型っぜく曞く方がモダンな感じがしたす。
芁出兞

enumを積極的に䜿う

䜿える堎面であれば、enumを積極的に䜿いたしょう。

たずめ

終盀雑になりたしたが、以䞊が僕の「誰か教えおよ〜〜〜」ずなったSwiftの曞き方でした。
䜕かの圹に立おば幞いです。
誀字脱字/誀りありたしたら、ご指摘/線集リク゚ストお願いしたす🙏🙏🙏

143
146
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
143
146