Swift学習①(codebelle)

【Swift を学ぶ目的】

Ios アプリを作成したい(家計簿アプリ、ゲーム)

・比較的簡単らしく、Xcodeがあればすぐに開発をはじめられるのでどんどんやりたい

 ドットインストールにもXcode の使い方(無償)とSwift 入門(有料)があったため 併用していきたい。

 

 環境:xcode 、paiza.io(ブラウザエディタ)

 教材:codebelle

【本ブログについて】

・codebelleの講義を参考に自分なりにアレンジしたコードを載せ理解を深めていく。

・又、当ブログは非商用でありcodebelle公式のブログではない。

・《ハック》(改造)は教材での学習のみでは納得できなかった部分について、コードを追加・削除してみたり、オリジナルのコードを作成し試行錯誤してみた箇所。

・《観察》は《ハック》についての考察や、教材もしくはググって参考にした事について、自分なりに理解を深める箇所。

 

◆ Swiftの基礎知識まとめ

ダブルクォーテーション""で括った文章や数字を「文字列」

括らない数字は「数値」として扱う

文字列と数値の違いを「型」という。

 

関数とは何かの処理をするもの(例:print)

print():プログラミングの中身を確認できる関数

     カッコ()の中に渡す文字列や数値のことを「引数」という

 

変数:文字列や数値などを格納できる箱、同じ型のデータしか入らない

   箱を作る作業を「宣言」という→「変数を宣言する。」

   var name = "リンゴ" _name が変数にあたる

◆ 変数var

var:同じ型(数値か文字列か)のものだけ入る

   新しく入れると古いものは上書きされる

【例】

 var kudamono = "あっぷる"

 kudamono = "みかん" _"あっぷる"は"みかん"に上書きされる。

 

《ハック》

 var price=5000

 print(price)

 price=price*2000

 print(price)

  _結果

   5000

   10000000

 

《観察》

 5000 と宣言したprice に2000 を掛けたことで数値が変わった

 10000000が5000を上書きしたのか。すごいプログラミングっぽい。楽しい。

 

変数に入る型を明示的に指定するにはコロン:を用いる

【例】var 変数名: 型 = 値

 var AAA:String = "洋梨"

 var price:Int = 300

 var wight = 80

 var size = 10

 

Swift には型を自動で判定する型推論機能が備わっているため

""で括れば文字列型、括らなければ数値型と区別してくれる。

必要があれば型宣言すればよい...?

 

ハック》

 型の頭文字が大文字でないとエラーが起きる→そういう決まり?

 Int型に小数値を入れることはできない模様→Double 型に整数値は可能

  演算子の前後に空白はあってもなくてもおkだが、片方にしかない場合はバツ

◆ 定数let

 var との差異は、1 度入れた値を置き換えることができない点(税率や誕生日か)

【例】

 var Birth = 18

 Birth = 1 _税率が書き換わっちゃう!

 let Birth = 18

 Birth = 1 _エラーおきる

 

《ハック》

 同じ値を再度入れてもエラーがおきる模様。

 

 var やlet は一行で複数の宣言をすることが可能らしい。

 定数のみを複数宣言するときはカンマ,をかます

 変数のみの複数宣言する場合も同様

 変数と定数を同じ行に宣言するときはセミコロン;をかます

 

【例】

 let apple=10, banana=5 _○ let apple; var banana=5 _○

 let apple=10, var banana=5 _変数と定数をまとめて宣言するときはセミ
 コロンで区切るから×

 

《ハック》

 カンマやセミコロンで区切るときはスペースを用いなくてもイケる

 片方だけスペースがある場合でもイケる

 全角スペースはバツ

 

《観察》

 スペース有無によりエラーが発生するのは演算子に限るのか?

  

◆ 型の種類

 型の明示的な指定でコロンを用いる

 その際指定される型には種類がある。

【例】

 String 型:文字列 "ぴーなっつ"

 Int 型:整数値 1000

 Double 型:小数 3.14

 

◆ 型の指定

 初期値を指定しておけば、型推論が効くため、改めて型の指定をする必要は無い

 初期値とは、var fruit = "バナナ" のようにはじめに宣言しておくこと。

 初期値を設定せずにプログラミングの途中になって値を入れる場合は型推論が効かず、型の指定を省略できない。

【例】省略できないパターン

 let fruit:int

 let namae:String

 fruit=216

 namae="バナナ"

 

《ハック》

 ためしに初期値Int,String を宣言しなかった結果エラーが発生した、そらそうか

 

《観察》

 初期値を宣言する時としないとき、どういった違いがあるのだろう

 人によるのか、それとも書きたいプログラムの構造によって使い分けるのか

 まだ具体的にプログラムを書いていないからピンと来ない

 

◆異なる型同士では計算できない

 int 型とDouble 型など、同じ数値でも型が異なると計算できない。

【例】

 var apple = 100

 var tax = 0.08

 var goukei = apple * tax

このままでは整数値と小数値の計算ができないため、ある方法をとる。

後ほど...

 

◆ 変数名

 変数名は基本自由だが、ルールある。

 (var name = 100 でいうname が変数にあたる)

 

・変数にはプログラミング言語のキーワードとして使われる「予約語」は使えない

(var,let,if,while など)

・数字から始まる名前(1apple など) _apple1 ならおk

演算子が含まれている名前(mac+10,NN*50 など)

・スペースを含んでると×(AA apple など)

 

◆ タプル

 タプルとは1つの変数に複数の値を入れることができる仕組み。

【例1】

 var かlet タプル変数名=(値,値,)

 var fruit=("キウイ",6000)

 

《ハック》

 fruit をprint した結果→("キウイ", 6000)

 

《観察》

タプルの場合カッコで括らなきゃいけないから、print で出力するとカッコも出てきてしまうのか。ださい

 

タプルにも型推論が効く

あえて型指定をするなら以下のような記述をする。

【例2】

 var namae:(String,Int)=("キウイ",6000)

 

《ハック》

2つの値をどちらも文字列とし、型宣言をString1つにしてみた

var fluit:(String)=("リンゴ","バナナ")

結果エラーが発生。

 

《観察》

 同じ型だとしても複数の値を入力したいときは、値と同じ数の型を宣言する必要があるっぽい

 

タプルは異なる型や値でも、意味的に1つにまとめておきたい時に活用できる機能だそう。

データを入れ替えるときは、宣言時と同じ順番に記述し、入れ替えたいデータの部分のみを書き換える。

【例3】

 var apple=("キウイ",6000) ↓入れ替え

 var apple=("みかん",100)

 

《ハック》

 例3 の入れ替えで、キウイと6000 を交換してみた

 結果→エラー発生

 main.swift:2:5: error: invalid redeclaration of 'fruit'

 var apple=(6000,"キウイ")

 main.swift:1:5: note: 'fruit' previously declared here

 var apple=("キウイ",6000)

 

《観察》インデックス番号については後述

 appleには既にインデックス番号0 にString のキウイが、インデックス番号1 にInt の6000が宣言されている。型が異なるため「既にfluit が宣言済み」とエラーが発生したのだろうか。

 

タプル宣言したデータを取り出す際、インデックス番号かラベルを用いる。

インデックス番号は複数ある者に順番に数字を振って区別する方法。0からはじまる。

【例4】

 例2 を取り出すとき

 apple(fruit.0)でキウイ。 apple(fruit.1)で6000 が取り出せる。

 ドットで区切って番号を指定する模様。

 

ラベルは値に名前をつけて管理することができる。

【例5】

 var apple=(name:"キウイ",price:6000)

 print(apple.name)

 name,price がラベル。出力結果は「キウイ」となる。

 

《ハック》

 型宣言をしてタプル(ラベル)を使う。キウイだけを出力したい。

 var apple:(String,Double,Double)=(name:"キウイ",price:6000,kosuu:5)

 print(apple.name)

 →結果コンパイルエラー ↓メッセージ

  main.swift:3:7: error: value of tuple type '(String, Double, Double)' has no member

  'name'

  print(apple.name)

 

《観察》

 型宣言を無くして型推論にしてみたら、「キウイ」と出力された。

 型宣言をするとなぜダメなのか。

 また、print(apple)にしたら("キウイ",6000,5)と出力された。

 ラベルが間違ってる訳でもなさそう。なぜだ。

 

        ↓↓↓↓↓解決↓↓↓↓↓↓

 

 参照: http://hajihajilemon.com/smartphone/swift/%E3%82%BF%E3%83%97%E3%83%AB%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/

 はじはじさんのアプリ体験記において、タプルでラベルをつけた型の宣言のサンプルを発見

 

//ラベルをつけて宣言する

   var person3:(name:String, age:Int, height:Double) = ("田中", 35, 170.0)

   print(person3)

  

 型宣言と一緒にラベルも宣言する模様。

 ラベルの記載場所が間違ってたのか~~~

 もう一度ためす。

  var tax:Double=0.08

  var apple:(name:String,price:Int,kosuu:Int)=("腐ったキウイ",6000,5)

  print(apple.name)

   →結果「腐ったキウイ」と出力

     やったぜ

 

《ここまでやってみてひとこと》

 ・タイプミスが多い。 ; : , . の使い分けを記憶しなければいけない。

 ・宣言の方法にいろいろ種類がある(型指定するしない・ラベルを使うかインデックス番号を使うかなど)が、どのように使い分けするのかが分からない。実践的にプログラミングをはじめたわけではないので仕方ない。

 

 

《ハック》

var tax:Double=0.08

var fruit:(name:String,price:Int,kosuu:Int)=("ゴールデンキウイ",6000,5)

print(fruit.name,"を全て買うと",fruit.price*fruit.kosuu,"円もします!")

→結果 ゴールデンキウイ を全て買うと 30000 円もします!

 

《観察》

なんかきたない気がする・・・

後スペースのせいで初代ポケモン感がでた。詰めるにはどうしたらいい...