タイトル : Swiftのチートシートみたいな 2022/7,8
更新日 : 2022-10-16
カテゴリ : プログラミング
タグ :
swift   

Swiftのチートシートみたいな

2022/7,8に勉強したことをざっくり、短くまとめておきます(まとめた日は10/16です。なかなか手がつかないな~)

Swift 入門 で勉強したので、その抜粋みたいですね

短く? 短くなってないな...

★変数は var で定数は let です。型を書ける
var 変数名: データ型 = 値
型は書かなくてもOKです。
var v1 = 1.1 は Double型

変数名は、英字で始めてあと英数字といくつかの記号...というルールではなく、
数字で始めることが出来ない等のルールです。★つまり、日本語の変数名でもOKになります。
キャメルケースです。

コメント
  // で一行、/* */ で複数行

基本のデータ型 (例) は値を代入した時の型です。
Int - 整数 (例: value = 1)
Double - 64-bit の浮動小数点数 (例: value = 1.5)
Float - 32-bit の浮動小数点数
Bool - ブール値 (例: value = true)
String - 文字列 (例: value = "Hello")
Array - 配列 (例: value = ["apple", "orange", "banana"])
Set - セット
Dictionary - 辞書 (例: value = ["make": "Toyota", "year": "2020"]) 

ソース
  var va = Double("ABC")
  print(type(of: va))
コンソール出力結果
  Optional<Double>

  引数指定は (of: 値)のように ★キーワード付きが推奨 みたい
  nullがあり得る時は、Optionalで返ってくる。★Optinalに慣れないとね。

タプル (tuple) あり。() で囲まれてカンマで区切られた複数の値のグループです
  要素のデータ型を揃える必要なし。
  要素の追加、削除や型変更は出来ないけど、変更なくて一つにまとめたい時に使いましょう。

複数行のStringの書き方は、"""の例のヤツ。

String
  空か : isEmpty
  文字数 : count  (UTF-8での文字数です)
  Interpolation(文字列補間) : "Hello, \(name)!"
  分割 : split() 
  返ってくるのはStringではなく、Substring 型の配列。
    ★こんな感じで、元のコピーを作るではなく、元の変数での情報込みで取得するのが流儀らしい
  置換 : NSString の replacingOccurrences()
    つまり、import NSString しないとね
  含むか : contains()
  トリム : trimmingCharacters(in: .whitespaces)とか
  日付へ変換 : let df = DateFormatter()
            df.dateFormat = "yyyy-MM-dd HH:mm:ss"
            if let date = df.date(from: dateString)

a === b   a と b のインスタンスが同じ参照をポイントしている
a !== b   a と b のインスタンスが同じ参照をポイントしていない

範囲指定
  1...10	1 から 10 まで  Closedrange<Int>
  1..<10	1 から 9 まで
  3...	3 から残り全部 PartialRangeFrom<Int>(lowerBounrd: 3)
  ...10	一番最初から 10 まで
  ..<10	一番最初から 9 まで

for-in文もあるよ
  for-in ループ と ForEach()の違い:forEach() では break や continue が使えないことなど

降順に変える
  sort(by: >)

Set()
  Arrayと同じようだが、重複無しです。順番持ってないのでindex参照もなし。
  intersection() 積集合、union()  和集合、subtracting(set2) 差集合、
  symmetricDifference(set2) 対称差集合、== 同じ、
  isSubset() 部分集合、isSuperset() 上位集合、isDisjoint() 交わりがない等あるよ

switch 文は上から順番に値をチェックしていって、最初にマッチした case のコードブロックを実行して switch 文を抜ける。
抜けたくない時はコードブロックの最後に fallthrough キーワードを追加します。
  switch value {
  case 4:
      print("value は 4 です。")
      fallthrough
  case 2, 4, 6, 8:
      print("value は 2, 4, 6, 8 のどれかです。")
  default:
      print("その他です。")
  }

Optional
  ?? でデフォルト値を指定
    print(i ?? "Invalid input") # i がOptinalの時に、Invalid inputを出力する

  unwrap
    let value: Int? = 100
    print("Value = \(value!)") # nilの時はエラー

  Optional Chaining 演算子は ? です
    let s:String? = "abcde"
    if s?.contains("c") == true {
        print("c exists.")
    }

  Optional Binding
    値が存在するかどうかを確認して、存在する時のみその値を定数や変数に代入して続きの処理を行う。
      if let i = value {
        i を使う
      } else {
        print("No value exists.")
      }

  guard let
    続きの処理をするのに値が確実に存在していることをはっきりさせたい時
    func greet(name: String?) -> String {
        guard let name = name else {
            return "No name"
        }   
        return "Hello, \(name)"
    }
    print(greet(name: nil))
    print(greet(name: "Sakura"))

関数
  書き方
    func 関数名(引数名1: 引数1のデータ型, 引数名2: 引数2のデータ型=デフォルト値, ...) -> 戻り値のデータ型 {
      関数のコードブロック
      ...
      return 戻り値
    }
      // デフォルト値指定は = で。
    
    引数の定義の箇所で ★ _ を指定しておくと引数名なしでOK
      func 関数名(_ 引数名1: 引数1のデータ型,
    
  ★参照型がある
    関数に値型ではなく、参照型で渡すと、関数の中で変更出来ますね。
    inout キーワードを入力の引数のデータ型の前につけ、呼び出し側の変数の前に & をつける
    func splitName(name: inout String) -> (lastName: String, firstName: String) {
        split出来なかったら、name自体を書き替えちゃう
    }
    
    let nameSplit = splitName(name: &name)

enum(列挙型)
  値は指定しなくても良いよ
    enum Direction1: Int {
      case up = 0
      case down
      case left
      case right
    }
    let d1 = Direction1.left
    print(d1.rawValue) // rawValueで実際の値がとれるけど、Direction1.leftで参照出来るし


struct
  値を保持するためのプロパティや関連する機能のメソッドなどをまとめて定義する
  え! メソッドも持てるの? クラスと何が違うの?
  ★ struct は値型で、class は参照型 になります
   つまりstructのコピーはDeep Copy?みたいになるってこと

  struct Struct名 {
    var プロパティ名1: データ型1
    var プロパティ名2: データ型2

    func メソッド名() {
        メソッドのコードブロック
    }
  }

class
  class DerivedClassName: ParentClassName {
    init() {
      super.init()
    }

    deinit { ... }  // ディイニシャライザー
  }