MasKのpermission denied.

新卒2年目WEBエンジニアの僕がぶつかった技術的な問題や発見のメモ

PHPエンジニアの僕がswift勉強し始めてメモった点まとめ【前編】

最近swift始めたんですが、PHP2年やってた僕には抵抗のある部分も多かったのでメモった点をまとめました。


・ビルドによって生成される成果物をターゲットと呼ぶ
・プロジェクトの保存場所は

/Users/{user_name}/Library/Developer/Xcode/DerivedData/HelloWorld-afwixjyhbkthbqdnwsxeccureqtk/Build/Products/Debug
こんな場所

・ターミナルからの実行方法は

上記フォルダに移動し、./HelloWorld

swiftでは’'で囲えない。””を使う
演算子は前後に半角スペースを空けないといけない。
・文字列内で式展開する場合

println(“4足す5は\(4 + 5)”)
でできる。

・変数宣言

var 変数名: [型]
か、型推論機能を使って
var 変数名 = 100

・定数宣言

let birthYear = 1991
で宣言する。
定数はかならず宣言と同時に初期化する

・インクリメント
var myAge = 30
var newAge: Int

newAge = ++myAge  // newAgeもmyAgeも31

newAge = myAge++ //myAge: 31, newAge: 30
・Character型とString型
var char = “あ” // String型に型推論されるので注意
・Int型は_で区切れる
var money = 5_000_000  // var money = 5000000 と同値
浮動小数点型はDouble型(64bit)とFloat型(32bit)がある
var num1 = 3.14  // Double型に型推論される
var num2: Float = 1.23 // Float型
・配列っぽいやつをタプル型と呼ぶ
var person: (String, Int) = (“太郎”, 23)
var person = (“太郎”, 23)  // 上と同値

var person = (name: “太郎”, age: 23)

person.name // 太郎

みたいな使い方が可能

var (name, _) = person
で name に太郎という変数が入る。_ でスルーすることも可能

・オプショナル型

値が存在するかしないか2つの状態のある変数
var oNum: Int?

で使う。
var oNum: Int? = 15
で値が存在する状態にできる。

普通の足し算などをするときはアンラップをする必要がある。
var num: Int? = 5
var sum = 10 + num!
のようにnum!でアンラップできる。

・配列

var names = [“a”, “b”]
アクセスは
names[1] // “b"

・辞書

var customs = [10: “太郎”, 11: “二郎”, 12: “花子"]
var aCustomer = customers[11]! // アンラップする必要がある?

・関数

関数は
func hogehoge(num: Int) -> Int {}
の形式で記述。引数で型指定が必須かつ、戻り値がある場合は -> Int のような形で戻り値の型も指定しなければならない。

また、関数は使用される場所よりも前に宣言する必要がある。

・typealias

Cで言うtypedef。
typealias 別名 = 型
ex) typealias NSTimeInterval = Double

・struct, class

構造体の宣言は struct 構造体名 { … }
クラスの宣言は class クラス名 { … }

・構造体にはデフォルトイニシャライザとメンバーワイズ・イニシャライザ

デフォルトイニシャラザとメンバーワイズ・イニシャライザは併用可能。

・クラスには明示的にイニシャライザが必要。

デフォルトイニシャライザはあるので、初期値を明示すればイニシャライザは必須ではない。

・列挙型
enum Season {
     case Spring
     case Summer
     case Autumn
     case Winter
}

あるいは
enum Season {
case Spring, Summer, Autumn, Winter
}

・アクセスコントロール

public: どこからでも
internal: 同じターゲットからのみアクセス可能
private: 同じファイルのみからアクセス可能

・クラスのメソッドの呼び出し

クラスのメソッドで引数を取る場合、第一引数については外部引数名を指定せず、2つ目以降は外部引数が必要。

・構造体のプロパティを変更する

構造体のプロパティを変更するメソッドにはmutatingを記述する
mutating func setBirthday() { … }

・条件分岐

if 条件式 { … }
条件式に()はいらない
条件式が成立するのはtrueの時のみ。よって1 や ‘aaa’ の時は成立しない。
クラス型の変数が同じインスタンスを参照しているかは
=== or !== で判定できる。

・条件演算子

result = val1 > val2 ? val1 : val2
で表記できる。

・switch文
switch month {
     case 1:
          println(“睦月”)
     case 2:
          …
     default:
          println(“例外")
}

的な使い方。一般的な言語と違いbreakは必要ない。
※ default: の後に何も記述しないとエラーになるので、その場合はbreakを記述する。

・switch文に複数の値を指定できる
switch month {
     case 12, 1, 2:
          println(“冬です”)
     case 3, 4, 5:
          ...
}
・レンジ演算子

0…3 で 0~3の整数値の範囲を表す。
0..<3 なら 0~2の整数値

・where条件式

switch age {
case let n where age > 0 && age <= 5:
println(“\(n)歳は子供料金です”)
case let n where age >= 6 && age <= 11:
….
}

where 以後の条件がtrueならnにageの値が代入される。

・for文

for var i = 0; i < 10; i++ {
….
}

・for-inループ

for num in 0..<10 {
….
}

numを使用しない場合、_ を使った以下でも可。
for _ in 0..<10 {
….
}

・whileループ

()がないだけで普通とだいたい同じ。

・do-whileループ

do {
….
} while 条件式
となる。

・break文、while文

一般的な用法。

-文字列操作-

・文字数取得
countElements(“あああ”)     // 3 マルチバイト文字も1文字とカウント
.toInt()     // Int型に変換。オプショナル型が返る
・String()のイニシャライザは浮動小数点型を引数に取れない
let pi = 3.14
let piStr = String(pi) // エラー
let piStr = “\(pi)”     // OK
・文字列連結は + でおk

文字と数値を連結するには

var str = 1980 + “年生まれ”     // エラー
var str = String(1980) + “年生まれ”     // OK
・文字列比較

比較は == でおk< や > を使うと辞書順の比較ができる
if “aaa” > “aa” { …. }