Swift 5.データタイプ

# 5\. Swiftデータタイプ 定数,変数

## 5-1 プレーグラウンド使う

## 5-2 スイフトデータタイプ
それぞれの〇と一をBitという、そしてBit8を集めてByteを作る。
普段は32bit , 64bit パソコンはCPUバースがすぐに動けなくなるbitの数を言います。
人はバイナリで考えありません。この間でコンパイルがする。
スイフトみたいなプログラミング言語は**データタイプを定義**します。
これは**人が理解できる様に**データを処理する。
```swift
var myNumber = 10
```
これをパソコンは
```swift
1010
```
でコンパイルして理解します。

## 5-3 スイフト変数
## 5-4 スイフト常數
## 5-5 変数と常数宣言
基本的にoptionalが宣言だと見なされます。
Appleはコードの効率や実行向上のために常数を使うことを進めます。
## 5-6 ターイプアナテーションとターイプ推論
スイフトはターイプが安全なプログラミング言語です。
**変数のタイプが決まった後には他のタイプのデータを貯蔵する事ができません。**
もし、行うときにはコンパイルエラが出ます。
タイプを指定する方法は二つあります。
:を使って確かなことを指定する。
```swift
var usserCount: Int =10 
```
もしこれがいない場合にはcompilerはtype infereceしてます
```swift
var signalStrength = 2.223 // Double
let companyName = "My Company" //string
```
:を使ってターイプを指定しればvalueが真っ直ぐ必要ないですけど、
inferenceときにはValueが必要です。
もしターイプを指定を使う時にはそう様なことを作る事ができます。
```swift
let bootTitle: String
.
.
if iosBookType{
    bootTitle = "SwiftUI Essentials"
} else{
    bookTitle = "Androide Studio"
}
```
## 5-7 スイフト テュフル
いちばん単純と強い機能を持っている物。
![代替](https://i.imgur.com/xkvwlfa.png)
臨時的にグルピーんくする簡単な方
様々なタイプがこの中で貯蔵

```swift
let myTuple = (10, 432.433, "This is a String")
myTuple.0
print(myTuple)
```
一番最初の値打ちは0から計数します。
myTuple.0 = 10です

他の方法で　一つのシンタークスでテュフルで全ての値を取り上げて変数と常数で一つ一つ分配することもできる。

```swift
let (myInt, _ , myString) = muyTuple
```
もし使わない値の位置で' _ ' を　支えれば、その根は無視られます。
またテュフルを生成するときで、それぞれの根を変数で割り振ることも出来ます。
```swift
let myTuple = (count:10, length: 432.433, message:"this is a String")
print(myTuple.message)
>> "this is a String"
```

## 5-8 スイフト　オフシャナルタイーフ
![代替](https://i.imgur.com/38pFc2E.jpg)
これは対部分の他の言語にはいない、新い概念です。
この目的は変数と常数で、根が分配しない状況を予報することです。
コンフールとランターム味方に見ると、**何も割り振らないねてを持っている**オフシャナルタイプはnilの根を
持っています。

```swift
var index: Int?
```
もし、オショナルタイプでねが割り振りったれば、
オショナルの内で**ラッピング**だったと言います。
そして、オショナル中でラッピングだったねを使うときには**強制アンラッピング**だっと言います。
オショナルを使うときには「!」を付けて利用します


```swift
var index:Int?
index = 1
var treeArray = ["Oak","Pine"]
if index != nil {
print(treeArray[index!])
}else{ print("no value")
}
```
もしここで index!の　!をつかなはないときには、
```swift
Value of optioal type 'Int?' must be unwrapped to a value of type 'Int' 
```
だと言います

### Optional Binding
を使用で仮の変数と常数に割り振る事ができます。
```swift
if let constantname = optionalName{
}

if var variablename = optionalName{
}
```
最初は**オショナルを持っているか**どうかを確認すること、
次は**オショナル変数が根を持っている場合に**宣言された変数と常数にそのねを割り振りってコードが行う
```swift
var index: Int?
index = 3
if index != nil {

}
== 
var index: Int?
index = 3
if let myvalue = index{
    print(treeArray[myvalue])
}
```
ここで　index変数で割合った値が　アンラッピングられて myValueだと臨時常数に割あって配列に対したいんだクスで使えます。
それが
```swift
if let index = index {
    print(treeArray[index])}
else { ...
```
そうすることもできるので
swift5.7から　if-let
```swift
if let index {
print(treeArray[index])}
else{...
```

### Implicity Unwrapped 
```swift
var index: Int! 
if index != nill {...
```
確かなものはオショナル以外にはnilを　
割り合う事が出来ません。
```swift
var myInt= nil (x)
var myStirng:string = nil (x)
```

## 5-9 type casting and type check
swift codeを記入するときで compilerがある値の特定のタイプ識別できない時があります。
その時は**MethodとかFunctionがreturnする, valueがUnclearとかunpredicted typeのvalueの時**でたまに発生します。
さして as　kewordを使えて、私たちがどんなTypeを意図するかをcompilerがしてさせることが必要です。
それをtype castingともします。
```swift
let myValue = record.object(forKey: "comment")as! String
```

じつは　upcastingとdowncasting 二つがあります。
![代替](https://i.imgur.com/h0MfjSC.png)
upcastingは特定classの客体が上位のclassの中で一つに変形られることを言います。
upcastingは　as kewordを使えて行うと、そんな変換は成功られると、compilerが教えることができるせいでGuaranteed conversionだとも言う。
**CastleはHouseの下位classなので**次の様にUpCastingできます。
```swift
let myButton : UIButton = UIButton()
let myControl = myBUtton as UIControl
```
反面、Downcastingは**あるClassから他のClassに作る変換が起きる時**に発生する。
この様な**変換が安全に遂行されるとか有効ではない変換の試すを、compilerがつかみ出せると保証を出来ません。**
もし、出来ない変換をしたので、compilerが発見できなれば、大部分のRuntimeでErrorが発生するだろう。
普段はあるClassそのClass下位Classに変換することになる。
DownCastingはas! kewordで遂行されて、これをfoced conversionだっと言います。
```swift
let myHouse: House = House()
let myCastle = myCastle as House()
>>'Castle' is not convertible to 'House'

let myCastle = myCastle !as House()
```
もっと安全なDownCastingは　as?を使ったoptional Bindingを使うことです。
```swift
if let myTextView = myScrollView as? UITextView{
print("succed")} else { print("failed")} 
```
is keywordを使ってType checkをする事も出来ます。
```swift
if myojbect is Myclass{
}
```
## 5-10 要約
変数と常数の宣言、DataType, Type安定性、TypeInference, Optional etc...