[SwiftUI] ブラウザで表示するWebリストを作る

WebブラウザでURLを開くにはLink()を使う
Webブラウザとの行き来の仕組みはLink()機能に組み込まれている
Webページのデータは構造体として定義する
Identifiable, UUID, List, Link, URL, UIApplication.shared.canOpenURL

ContentView.swift

struct webData: Identifiable {
    var id = UUID()
    var name:String
    var url:String
    var favicon:String
}

let webList = [
    webData(name: "アップル", url: "https://www.apple.com/jp/", favicon: "apple"),
    webData(name: "東京国立博物館", url: "https://www.tnm.jp", favicon: "tnm"),
    webData(name: "東京都現代美術館", url: "https://www.mot-art-museum.jp", favicon: "mo"),
    webData(name: "川崎水族館", url: "https://kawa-sui.com", favicon: "kawa-sui")
]

struct ContentView: View {
    var body: some View {
        NavigationView {
            List(webList) { item in
                Image(item.favicon).resizable().frame(width:40, height:40)
                Link(item.name, destination: URL(string: item.url)!)
            }.navigationTitle("Webリスト")
        }.navigationViewStyle(.stack)
    }
}

webリンクはLink(_ title:String, destination:URL)で作ることができる
URLのチェックは UIApplication.shared.canOpenURL(url)によるURLチェックの仕組みを合わせられる

            List(webList) { item in
                HStack {
                    Image(item.favicon).resizable().frame(width:40, height:40)
                    if let url = URL(string: item.url), UIApplication.shared.canOpenURL(url){
                        Link(item.name, destination: url)
                    } else {
                        Text(item.name).foregroundColor(.gray)
                        + Text(" URLエラー ").foregroundColor(.red).italic()
                    }
                    
                }
            }.navigationTitle("Webリスト")

なるほどー 
ラッパーがかなり用意さてますね

[SwiftUI] 複数セクションがあるリスト

2つのセクション

struct ContentView: View {
    let shikoku = ["徳島県","香川県","愛媛県","高知県"]
    let kyushu = ["福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県"]
    
    var body: some View {
        List {
            Section(header: Text("四国").font(.largeTitle).padding(.top),
                    footer: Text("最高標高は石鎚山の1982m")){
                ForEach(shikoku, id:\.self){ item in
                    Text(item)
                }
            }
            Section(header: Text("九州").font(.largeTitle).padding(.top),
                    footer: Text("最高標高は宮之浦岳の19,36m")){
                ForEach(kyushu, id:\.self){ item in
                    Text(item)
                }
            }
        }
    }
}

InsetGroupListStyle, GroupListStyle, InsetListStyle, PlainListStyle, SidebarListStyle, SidebarListStyleなどがある

### 行に表示するビューを定義
Assetに写真を入れ、PhotoData.swiftを作成

PhotoData.swift

import Foundation

struct PhotoData: Identifiable {
    var id = UUID()
    var imageName:String
    var title:String
}

var photoArray = [
    PhotoData(imageName:"IMG_0996", title: "湘南平展望レストランFlat"),
    PhotoData(imageName:"IMG_1035", title: "アウトリガーカヌー"),
    PhotoData(imageName:"IMG_1504", title: "えぼし号"),
    PhotoData(imageName:"IMG_1531", title: "富士山"),
    PhotoData(imageName:"IMG_2139", title: "DENTAL CLINIC"),
    PhotoData(imageName:"IMG_2250", title: "鵠沼漁港白灯台"),
    PhotoData(imageName:"IMG_2269", title: "サザンビーチ海の家"),
    PhotoData(imageName:"IMG_2470", title: "天使の翼"),
    PhotoData(imageName:"IMG_2883", title: "スイミングスクールバス"),
    PhotoData(imageName:"IMG_4199", title: "小田急線江ノ島駅"),
    PhotoData(imageName:"IMG_6460", title: "鷹取山"),
    PhotoData(imageName:"IMG_7122", title: "支笏湖ぼスワンボート"),
    PhotoData(imageName:"IMG_7216", title: "とまチョップ"),
    PhotoData(imageName:"IMG_7745", title: "スナックJunko"),
    PhotoData(imageName:"IMG_7851", title: "山の電話ボックス")
]

RowView.swift
  L RowView_Previews: PreviewProviderで一行だけのレイアウトを確認できる

import SwiftUI

struct RowView: View {
    var photo:PhotoData
    var body: some View {
        HStack {
            Image(photo.imageName)
                .resizable()
                .frame(width: 60, height: 60)
                .clipShape(Circle())
                .overlay(Circle().stroke(Color.gray))
            Text(photo.title)
            Spacer()
        }
        
    }
}
struct RowView_Previews: PreviewProvider {
    static var previews: some View {
        RowView(photo:photoArray[0])
            .previewLayout(.sizeThatFits)
    }
}

ContentView.swift
L identifiableプロトコルを採用した構造体であればphotoArrayを利用できる
L idはidentifiableプロトコルが指定するプロパティ
  L PhotoData.swiftのphotoArrayはアクセス権がinternalの為、アクセスできる

struct ContentView: View {
    var body: some View {
        List(photoArray){ item in
            RowView(photo: item)
        }
    }
}

### リストから詳細ページを開く

struct PhotoDetailView: View {
    var photo:PhotoData
    
    var body: some View {
        VStack {
            Image(photo.imageName)
                .resizable()
                .aspectRatio(contentMode: .fit)
            Text(photo.title)
            Spacer()
        }
        .padding()
    }
}

struct PhotoDetailView_Previews: PreviewProvider {
    static var previews: some View {
        PhotoDetailView(photo:photoArray[0])
    }
}

詳細ページへの移動

struct ContentView: View {
    var body: some View {
        NavigationView {
            List(photoArray){ item in
                NavigationLink(destination: PhotoDetailView(photo: item)){
                    RowView(photo: item)
                }
            }
            .navigationTitle(Text("写真リスト"))
        }
    }
}

### 構造体
struct ContentViewは ContentView構造体を定義している

struct Member {
    let name:String
    var level = 1
    var age:Int
}

var member1 = Member(name: "鈴木", age: 19)
var member2 = Member(name: "田中", level: 5, age: 23)

let text1 = "\(member1.name)さん \(member1.age)歳 レベル \(member1.level)"
print(text1)

構造体イニシャライザ
  L selfはプロパティを指す

struct Box {
    let width: Int
    let height: Int
    let size: String
    
    init(width:Int, height:Int){
        self.width = width
        self.height = height
        if(width+height)<120 {
            size = "M"
        } else {
            size = "L"
        }
    }
}
let box1 = Box(width: 50, height: 50)
let box2 = Box(width: 40, height: 100)
print(box1)
print(box2)

プロトコルが指定してある構造体はプロパティやメソッドが定まっている

### ユーザ関数
戻り値の型を指定する

func calc(adult:Int, child:Int) -> Int {
    let money = adult * 1200 + child * 500
    return money
}

let price = calc(adult: 3, child: 2)
print(price)

引数の初期値を設定

func calc2(adult:Int = 0, child:Int = 0) -> Int {
    let money = adult * 1200 + child * 500
    return money
}

let adult1 = calc2(adult: 1)
let child2 = calc2(child: 2)
print(adult1)
print(child2)

値を返さない関数
L returnがなく、戻り値をvoidにするか、-> Voidを省略できる

import UIKit

var isPlay = false

func play() -> Void {
    isPlay = true
}
play()
print(isPlay)

構造体やinternalの意味がわかったわ
swiftを勉強すると、他の静的型付け言語の理解にもつながるね

[SwiftUI] コンテンツのリスト

### コンテンツのリスト
List, NavigationView, navigationTitle, navigationBarTitleDisplayMode

    var body: some View {
        List {
            Text("Content 1")
            Text("Content 2")
            Text("Content 3")
            Text("Content 4")
            Text("Content 5")
            Text("Content 6")
        }
    }

個別にviewを定義して呼び出す

struct ContentView: View {
    var body: some View {
        List {
            Text("Content 1")
            Text("Content 2")
            Photo1().frame(height:150)
            Text("Content 4")
            Photo2().frame(height:150)
            Text("Content 6")
        }
    }
}

struct Photo1: View {
    var body: some View {
        HStack {
            Image("bus")
                .resizable()
                .aspectRatio(contentMode: .fit)
            Text("えぼし号")
                .padding(.horizontal)
        }
    }
}
struct Photo2: View {
    var body: some View {
        HStack {
            Image("lighthouse")
                .resizable()
                .aspectRatio(contentMode: .fit)
            Text("白灯台")
                .padding(.horizontal)
        }
    }
}

リストにタイトル
  L NavigationViewのnavigationTitleを利用する

    var body: some View {
        NavigationView {
            List {
                Text("Content 1")
                Text("Content 2")
                Photo1().frame(height:150)
                Text("Content 4")
                Photo2().frame(height:150)
                Text("Content 6")
            }
            .navigationTitle("タイトル")
        }
    }

### 配列をリスト表示する
List, \.self, count, indices, ForEach-in, Array, append(), searchable, fillter(), inout

– Embed in List

        List(/*@START_MENU_TOKEN@*/0 ..< 5/*@END_MENU_TOKEN@*/) { item in
            Text("hello world")
        }

– Embed in HStack

        List(/*@START_MENU_TOKEN@*/0 ..< 5/*@END_MENU_TOKEN@*/) { item in
            HStack {
                Text(String(item))
                Text("hello world")
            }
        }

配列から要素を取り出してリストで表示

let metro = ["銀座線", "丸の内線", "日比谷線", "東西線", "千代田線", "半蔵門線", "南北線", "副都心線"]

struct ContentView: View {
    var body: some View {
        List(0 ..< 8) { item in
            HStack {
                Text(String(item))
                Text(metro[item])
            }
        }
    }
}

配列の要素の個数に影響されないコードにする

        List(0 ..< metro.count, id: \.self) { item in
            HStack {
                Text(String(item))
                Text(metro[item])
            }
        }

// このように書ける
    var body: some View {
        List(metro.indices, id: \.self) { item in
            HStack {
                Text(String(item))
                Text(metro[item])
            }
        }
    }

### 配列

import SwiftUI

let week:[String]
var nums:[Int]
var colors:[Color]
week = ["日","月","火","水","木","金","土"]
nums = [4, 8, 15, 16, 23, 42]
colors = [.red, .yellow, .green]

型推論

let week = ["日","月","火","水","木","金","土"]
var nums = [4, 8, 15, 16, 23, 42]

レンジで指定した要素を更新

var colors = ["green", "red", "blue", "pink"]
colors[1...2] = ["赤", "青", "黄"]
print(colors)

配列の追加

var words:[String] = []
words.append("花")
words.append("鳥")
words.append("風")
words.append("月")
print(words)

空配列
L append(contentsOf:)で複数の要素を一度に追加できる

var members = [String]()
members.append("英樹")
members.append("高次")
members.append(contentsOf: ["結城", "義郎", "正義"])
print(members)

配列の連結
L += で連結する

var data = Array<Double>()

let data1 = [3.6, 5.7, 2.2]
let data2 = [4.0, 3.1, 5.3]
data += data1
data += data2

data.sort()
print(data)

配列のスライス

let colorList = ["blue", "yellow", "red", "green", "pink"]
let myColor = colorList[1...3]
print(myColor)

配列から順に要素を取り出す ForEach-in

let colors:[Color] = [.red, .blue, .green, .orange, .yellow]
// 省略
        VStack {
            ForEach(colors.indices, id: \.self){index in
                Rectangle()
                    .frame(width: 150, height: 30)
                    .foregroundColor(colors[index])
                
            }
        }

randomElement()を使えば配列からランダムに要素を取り出すことができ、shuffle()あるいはshuffled()でシャッフルして並び替えることができる
fillter()関数を利用することで、リストに並んでいる値を検索で絞り込んで表示することができる

リストを検索表示

struct ContentView: View {
    let spots = ["東京都美術館", "国立新美術館", "国立近代美術館","東京国立博物館", "江戸東京博物館","国立科学博物館","新江ノ島水族館", "川崎水族館", "しながわ水族館"]
    @State private var searchText = "東京"
    
    var body: some View {
        NavigationView {
            List {
                ForEach(searchResults, id: \.self){ name in
                    Text(name)
                }
            }
            .searchable(text: $searchText, prompt: "スポットの検索")
            .keyboardType(.default)
            .navigationTitle("人気スポット")
        }
    }
    var searchResults: [String] {
        if searchText.isEmpty {
            return spots
        } else {
            return spots.filter {$0.contains(searchText)}
        }
    }
}

参照型

func incrimentNums(nums:inout [Int]){
    for i in 0..<nums.count{
        nums[i] += 1
    }
}

var data = [3, 5, 9]
print(data)
incrimentNums(nums: &data)
print(data)

これはエンドレスやな…

[SwiftUI] イメージと図形の表示

assetにドロップして、メディアライブラリを開いてプレビューにドロップする

画像サイズに合わせて伸縮

        VStack {
            Image("chicago")
                .resizable(resizingMode: .stretch)
                .aspectRatio(contentMode: .fit)
                .frame(width: 300)
            Text("Hello World")
                .padding()
        }

伸縮率と位置の調整

        VStack {
            Image("chicago")
                .resizable(resizingMode: .stretch)
                .aspectRatio(contentMode: .fit)
                .scaleEffect(1.8)
                .offset(x: -70, y: -30)
                .frame(width: 200, height: 300)
                .clipped()
            Text("Hello World")
                .padding()
        }

オーバーレイを使って文字を重ねる

        VStack {
            Image("chicago")
                .resizable(resizingMode: .stretch)
                .aspectRatio(contentMode: .fill)
                .scaleEffect(1.8)
                .frame(width: 300, height: 400)
                .clipped()
                .overlay(
                    Text("Hello World")
                        .font(.title)
                        .fontWeight(.light)
                        .foregroundColor(Color.white)
                        .offset(x: 0, y: -50)
                )
            Text("Hello World")
                .padding()
        }

### 図形の作成と配置
Circle, Ellipse, Rectangle, RoundedRectangle, Capsule, rotationEffect(), stroke(), ZStack, position()

円形を描写

        Circle()
            .foregroundColor(.blue)
            .frame(width: 200, height: 200)

楕円形

        Ellipse()
            .foregroundColor(.blue)
            .frame(width: 200, height: 400)

四角形

        Rectangle()
            .foregroundColor(.blue)
            .frame(width: 200, height: 400)
        // 角丸四角形
        RoundedRectangle(cornerRadius: 50)
            .foregroundColor(.blue)
            .frame(width: 200, height: 400)
        // カプセル
        Capsule()
            .foregroundColor(.blue)
            .frame(width: 250, height: 100)

図形の塗り色

        Circle()
            .fill(Color.pink)
            .padding(50)

Colorライブラリの指定
L Asset -> Color set -> RGB指定 -> ライブラリからドロップして指定

    var body: some View {
        Circle()
            .foregroundColor(Color("Wakakusa"))
            .frame(width: 300, height: 300)
    }

図形の回転

        Ellipse()
            .foregroundColor(.orange)
            .frame(width: 200, height: 400)
            .rotationEffect(.degrees(45))
            .clipped()

図形を重ねて表示
L 下に書いた方が上に表示される

        ZStack {
            Ellipse()
                .stroke(lineWidth: 4)
                .foregroundColor(.pink)
                .frame(width: 100, height: 300)
            Ellipse()
                .stroke(lineWidth: 4)
                .foregroundColor(.purple)
                .frame(width: 100, height: 300)
                .rotationEffect(.degrees(30), anchor: .bottom)
            Ellipse()
                .stroke(lineWidth: 4)
                .foregroundColor(.green)
                .frame(width: 100, height: 300)
                .rotationEffect(.degrees(-30), anchor: .bottom)
        }

### ビューの画像効果
Image, Text, clipShape(), shadow(), rotation3DEffect(), ZStack

        Image("chicago")
            .resizable()
            .aspectRatio(contentMode: .fill)
            .frame(width: 300, height: 300)
            .clipShape(Circle())

ビューに影をつける

        Image("chicago")
            .resizable()
            .aspectRatio(contentMode: .fill)
            .frame(width: 300, height: 300)
            .clipShape(RoundedRectangle(cornerRadius: 20))
            .shadow(radius: 20)

ビューを回転する

        Image("chicago")
            .resizable()
            .aspectRatio(contentMode: .fill)
            .frame(width: 300, height: 400)
            .clipped()
            .rotationEffect(.degrees(10), anchor: .center)

ビューの角を丸める

        Text("Hello, world!")
            .font(.body)
            .frame(width: 150, height: 150)
            .border(Color.pink, width: 10)
            .cornerRadius(10)

ビューを定義して背景に使う

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .font(.largeTitle)
            .padding(15)
            .foregroundColor(.white)
            .background(ShapeView())
            .cornerRadius(50)
            .frame(width: 150, height: 150)
    }
}

struct ShapeView: View {
    var body: some View {
        ZStack {
            Rectangle().rotationEffect(.degrees(45))
            Rectangle().rotationEffect(.degrees(-45))
        }
        .foregroundColor(.green)
        .frame(width: 50, height: 150)
    }
}

ビューを3D回転
L rotation3DEffectでYを軸にして回転

    var body: some View {
        Text("春はあけぼの。夜雨やう白くなり行く、山ぎは少し灯て、紫だちたる雲の細くたなびきたる。")
            .fontWeight(.light)
            .font(.title)
            .frame(width: 250)
            .rotation3DEffect(.degrees(45), axis: (x:0, y:1, z:0))
    }

スタック全体を3D回転

    var body: some View {
        ZStack(){
            Image("chicago")
                .resizable()
                .aspectRatio(contentMode: .fill)
                .offset(x: -70, y: 0)
                .frame(width: 250, height: 400)
                .clipped()
            Text("ほととぎす\n鳴きつける方をながむれば\nただ有明の月ぞ残れる\n")
                .fontWeight(.light)
                .font(.title)
                .foregroundColor(.white)
                .padding()
                .offset(x: 0, y: -5)
                .frame(width: 250, height: 400)
        }
        .rotation3DEffect(.degrees(45), axis:(x:1, y:0, z:0))
    }

なるほど、覚えること沢山あるな

[SwiftUI] レイアウトの調整

元のテキスト

        VStack {
            Text("春はあけぼの")
            Text("夏は夜")
            Text("秋は夕暮")
            Text("冬はつとめて")
        }
        .font(.largeTitle)

行間と文字揃え

        VStack(alignment: .leading, spacing: 15.0) {
            Text("春はあけぼの")
            Text("夏は夜")
            Text("秋は夕暮")
            Text("冬はつとめて")
        }

スペーサーを使って位置調整

        VStack {
            Spacer()
            VStack(alignment: .trailing) {
                Text("知性の自転車")
                    .font(.largeTitle)
                    .fontWeight(.black)
                Text("Bicycle for the Mind.")
                    .italic()
            }
            Spacer()
            VStack(alignment: .trailing) {
                Text("憐れみは恋の始まり")
                    .font(.largeTitle)
                    .fontWeight(.black)
                Text("Pity is akin to love.")
                    .italic()
            }
            Spacer()
        }

パディングを使った余白調整
.offsetで位置をずらせる

        VStack {
            VStack(alignment: .trailing) {
                Text("知性の自転車")
                    .font(.largeTitle)
                    .fontWeight(.black)
                Text("Bicycle for the Mind.")
                    .italic()
                    .offset(x: -10, y: 0)
            }
            .padding(.top, 80)
            VStack(alignment: .trailing) {
                Text("憐れみは恋の始まり")
                    .font(.largeTitle)
                    .fontWeight(.black)
                Text("Pity is akin to love.")
                    .italic()
                    .offset(x: -10, y: 0)
            }
            .padding(.top, 20)
            Spacer()
        }

パディングを使いこなす

    var body: some View {
        VStack(alignment: .leading) {
            Text("1. 枕草子/清少納言")
                .padding([.leading, .bottom], 20.0)
            Text("2. 春はあけぼの")
            Text("3. やうやう白くなり行く")
            Text("4. 山ぎは少し灯て")
                .padding()
            Text("5. 紫立ちたる雲の細くたなびきたる")
        }
        .padding(.vertical, 50.0)
        .padding(.horizontal, 30.0)
        .font(.callout)
        .border(Color.pink, width: 2)
    }

殆どCSSと遜色ないな

[SwiftUI] テキストの装飾

VStackとHStack

HStack {
            Text("おはよう!")
                .padding()
            Text("Placeholder")
            Text("Placeholder 2")
        }

横並びか縦並びかの違い

式の値を返す変数
L 式の値が1つだけならreturnを省略できる

var num:Int {
    let result = 2 * 5
    return result
}

print(num)

return HStackのreturnが省略されている
read onlyでgetが省略されている

    var body: some View {
        HStack {
            Text("おはよう!")
                .padding()
            Text("Placeholder")
            Text("Placeholder 2")
        }
    }

getterとsetter

var radius = 10.0

var diameter: Double {
    get {
        radius * 2
    }
    set (length){
        radius = length / 2
    }
}

var around:Double {
    get {
        let length = 2 * radius * Double.pi
        return length
    }
    set(length) {
        radius = length / (2 * Double.pi)
    }
}

print("半径が\(radius)の時、直径の長さは\(diameter)")
diameter = 30
print("直径が\(diameter)の時、半径は\(radius)")
around = 100
print("円周の長さが\(around)の時、円の半径は\(radius)")

libraryからコードを配置

    var body: some View {
        VStack {
            HStack {
                Text("Hello, world")
                    .padding()
                Text(/*@START_MENU_TOKEN@*/"Placeholder"/*@END_MENU_TOKEN@*/)
            }
            HStack {
                Text(/*@START_MENU_TOKEN@*/"Placeholder"/*@END_MENU_TOKEN@*/)
                Text(/*@START_MENU_TOKEN@*/"Placeholder"/*@END_MENU_TOKEN@*/)
            }
        }
    }

### フォントや縦横サイズの設定
font(), fontWeight(), foregroundColor(), frame(), padding()

フォントサイズ編集

        VStack {
            Text("Bicycle for the Mind")
                .font(.title)
                .fontWeight(.thin)
                .padding(.all, 40)
            Text("知性の自転車")
                .foregroundColor(Color.red)
        }

Line Limitとフレーム

        VStack {
            Text("春はあけぼの。やうやう白くなりゆく山ぎは、すこしあかりて、紫だちたる雲のほそくたなびきたる。")
                .lineLimit(2)
                .frame(width: 200.0)
        }

alignment

        VStack {
            Text("The quick brown for jumps over the lazy dog.")
                .font(.largeTitle)
                .multilineTextAlignment(.trailing)
                .frame(width: 200.0)
        }

Border
L 色は、red, orange, yellow, green, mint, teal, cyan, blue, indigo, purple, pink, brown, white, gray, black, clear, primary, secondaryが選べる

        VStack {
            Text("Bicycle for the Mind")
                .font(.title)
                .frame(width: 200.0, height: 200.0)
                .border(Color.green, width: 5)
        }

font size

        VStack {
            Text("Hello World")
                .padding()
                .font(.system(size: 100))
        }

frameの中での位置指定

        VStack {
            Text("The quick brown for \n jumps over \n the lazy dog.")
                .frame(width: 250, height: 200, alignment: .bottomTrailing)
                .padding()
        }

.titleや.heavyは Font.title, Font.heavyのFontを省略している

Inherited
L 上位の階層の設定があった場合に引き継ぐ

        VStack {
            Text("春はあけぼの")
            Text("夏は夜")
                .foregroundColor(.red)
            Text("秋は夕暮")
            Text("冬はつとめて")
        }
        .font(.title)
        .foregroundColor(.blue)

テキストを連結して表示

        VStack {
            Text("No.").bold() + Text("123").font(.largeTitle).foregroundColor(.red)
        }

とっつきにくい印象だったが、触ってみるとeasyね。

Swiftシンタックスの基礎

### 変数、タプル、型、繰り返し

var tanka = 120
var ninzu = 3 + 2
var price = tanka * ninzu

600

var km = 10
km += 5
km += 5
km += 5
var value = 0
value += 2
value *= 5
value /= 2

### 型推論

var title = "為替計算"
var dollar = 250
var rate = 108.5

inspectorで型を調べる事ができる

宣言

var title:String
var dollar:Int
var rate:Double

title = "為替計算"
dollar = 250
rate = 108.5

### varとlet(定数)

var title = "為替計算"
var dollar:Double
var rate:Double

dollar = 250
rate = 108.5

let yen = dollar * rate

### 文字列

let name = "高橋"
let who = name + " さん"

数字から文字列

let tanaka = 240
let kosu = 3
let kingaku = String(tanaka * kosu) + "円です"

文字列に変数や式を埋め込む
 L \(変数) で文字列に変数や数式を直接埋め込む事ができる

let time = 9.95
let result = "タイムは\(time)秒でした"

### タプル

var greeting = ("Hello", "こんにちは")
var guest = ("直鳥", "なおとり", 24)
var point = (23.1, 51.2, 13.8)

型指定

var greeting:(String, String) = ("Hello", "こんにちは")
var guest:(String, String, Int) = ("直鳥", "なおとり", 24)
var point:(Double, Double, Double) = (23.1, 51.2, 13.8)

型推論と型エラー
L 個数が

var greeting = ("Hello", "こんにちは")
greeting = ("宜しく", 4649)
var guest = ("直鳥", "なおとり", 24)
guest = ("金田一", "きんだいち")

### タプルの要素取り出し
使わない要素の場合は”_” を使う

var guest = ("桑原", "くわばら", 34)
let(name, _, age) = guest
let user = name + "さん、" + "\(age)歳"
print(user)

ラベルが付いているタプル

var user = (name:"鈴木", point:30)
user.point += 5
print(user.name)
print(user.point)

ラベル付きタプル

var point:(x:Double, y:Double, z:Double)
point = (4.2, 3.5, 6.1)
print(point.x)

インデックス番号でアクセス

var value = (100, 200, 300)
print(value.1)

for文

let numList = [4, 8, 15, 16, 32, 42]
var sum = 0
for num in numList {
    sum += num
}
print("合計 \(sum)")

整数のレンジから数値を順に取り出す

for x in 0 ..< 360*2 {
    let radian = Double(x) * Double.pi/180
    let y = sin(radian)
    print(x, y)
}

rangeの値を使わないforループ

var stars = ""
for _ in 1 ... 5 {
    stars += "★"
    print(stars)
}

なるほど、アンダースコア(_)の使い方がわかった
swift以外でも良く出てきてたけど、よくわかってなかったんだよね