var myNumber = 10 // lowerCamelCase, UpperCamelCase var myNumber : Int = 10 //int x = 10; //C언어
x= 10
var x = 10
print(type(of:x))
let s = MemoryLayout.size(ofValue: x)//8
let t = MemoryLayout<Int>.size
print(s, t) //swift memory size
결과
Int
8 8
var x = 10
print(type(of: x))
print(x)
print("x")
print("\(x)")
print("값은 \(x)입니다.")
// 문자열 안에서 변수를 출력하는 방법: \(변수 또는 상수명)





let myTuple = (10, 12.1, "Hi")
var myString = myTuple.2
print(myString)
결과
Hi
let myTuple = (10, 12.1, "Hi")
print(type(of:myTuple))
결과
(Int, Double, String)
let myTuple = (count: 10, length: 12.1, message: "Hi")
print(type(of:myTuple))
print(myTuple.message, myTuple.2)
결과
(count: Int, length: Double, message: String)
Hi Hi


- Int("100") // 100이 아닌 Optional(100)을 리턴함,print(Int("100")), Int형 initializer
- Int("Hi") // 정수 값을 반환할 수 없음, 아무런 값도 반환할 수 없다는 의미로 nil을 반환
- Swift에서 기본 자료형(Int, Double, String 등)은 nil값을 저장할 수 없음
- nil도 저장하려면 옵셔널 타입으로 선언해야 함
옵셔널 타입은 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법
옵셔널 타입 변수를 선언하기 위해서는 타입 선언부 뒤에 “?” 문자를 씀
- 주의 : 변수명 뒤에 “?”하는 것 아님
index라는 이름의 옵셔널 Int 변수를 선언
- var index: Int?
- index 변수는 정수 값을 갖거나 아무 값도 갖지 않을 수 있음(nil)

var x : Int?
var y : Int = 0
x = 10
print(x)
print(x!)
print(y)
x = x! + 2
print(x)
/*
x = x + 2 // 불가능. 위와 같이 !를 사용하여 강제로 언래핑 필요
y = x // 불가능. x와 y의 자료형이 각각 다르기 때문
아래와 같은 에러가 발생함. (if let이나 gaurd let을 사용해야 함)
원래는(강의에서) 이런 결과가 나옴
var x : Int? // nil
// x = 10
if x != nil {
// 여기서 x!=nil 과 같이 붙여 쓰면 강제 언래핑이 돼서 주의해야 함
print(x!)
} else {
print("nil")
}
결과
nil
※ 강제 추출 연산자(!)는 높은 우선순위를 가진다.
옵셔널 값이 nil일 경우 crash가 생길 수 있으므로 옵셔널 바인딩 또는 옵셔널 체인을 사용하는 것이 좋다

// online swift compiler 에서는 옵셔널형의 변수나 상수를 출력할 때 as Any를 사용해줘야 에러 없이 사용 가능함
var x: Int?
x = 10
print(x as Any) // 옵셔널을 Any로 변환하여 출력
if let xx = x { //옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행
print(xx) // 일반 Int 값이므로 문제 없음
print(x as Any, xx as Any) // x도 Any로 변환하여 오류 방지
} else {
print("nil")
}
/* 결과
Optional (10)
10
Optional (10) 10
*/
// 또는 아래와 같이 작성
var x: Int?
print(x as Any)
if let x { // Swift 5.7부터는 if let x 라고 써도 됨
print(x)
} else {
print("nil")
}
/* 결과
nil
nil
*/
참고 : https://docs.swift.org/swift-book/documentation/the-swift-programming-language/revisionhistory/
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/
var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"
if let firstPet = pet1, let secondPet = pet2 {
print(firstPet, secondPet)
} else {
print("nil")
}
과제 : 위 소스를 short form of if-let to the Optional Binding으로 변경
var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"
if let pet1, let pet2 {
print(pet1, pet2)
} else {
print("nil")
}
var age : Int?
age = 20
print(age) //과제:값은? Optional(20)
var myAge = age ?? 1
print(myAge) //과제: 값은? 20
var x: String? = "Hi"
print(x, x!)
if let a = x {
print(a)
}
let c = x ?? ""
print(c)

// = "Hi" 를 지우면 에러 발생. (강제 언래핑이 존재하기 때문)

형 다음에 ?가 아닌 !를 쓰는 옵셔널 형
Int!, String!
먼저 일반 옵셔널 값으로 사용하려고 하지만, optional로 사용할수 없는 경우 Swift는 값을 자동으로 강제로 품
Optional로 사용할 수 없으면 자동으로 unwrap함

참고 : 앱을 만들 때는 암묵적 언래핑(implicitly unwrapped)을 사용하는 경우가 많다
옵셔널 변수는 값을 초기화하지 않으면 자동으로 nil 값을 초기화한다 (변수에 nil값을 넣을 수 없음)

증가 연산자(++)와 감소 연산자(--)는 없음



과제 (실행 결과)
let names = ["A", "B", "C", "D"]
// 2... (2부터 끝까지)
for name in names[2...] {
print(name)
}
// ...2 (처음부터 2까지)
for name in names[...2] {
print(name)
}
// ..<2 (처음부터 2 전까지)
for name in names[..<2] {
print(name)
}
C
D
A
B
C
A
B
let defaultAge = 1
var age : Int?
age = 20
print(age) //과제:값은? Optional(20)
var myAge = age ?? defaultAge //age가 nil이 아니므로 언래핑된 값이 나옴
print(myAge) //과제: 값은? 20 (언래핑된 값)
var x : Int? = 1
var y = x ?? 0
print(y) // 1 출력




for i in 1...5 { print("\(i) 안녕") } for _ in 1...5 { print("안녕") }
let names = ["A", "B", "C", "D"]
for name in names {
print(name)
}
A
B
C
D
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/collectiontypes/

let numberOfLegs = ["human": 2, "Ant": 6, "Dog": 4]
//dictionary는 key:value형식의 배열
for (animalName, legCount) in numberOfLegs {
print("\(animalName)s have \(legCount) legs")
}
human have 2 legs
Ants have 6 legs
Dogs have 4 legs


중요!! 에러 수정 과제: error: expected '{' after 'if' condition
if 문 다음의 실행 코드가 한 줄이라도 괄호({})를 필수적으로 사용

수정 코드
for i in 1..<10 { if i > 5 { break } print(i) }결과
1
2
3
4
5



아래의 주석과 같이 하면 에러 발생
var a : Int? = 1 var b : Int? = 2 print(a,b) if let a1=a, let b1=b { //a와 b가 nil이 아니면, 언래핑하여 a1과 b1에 대입 print(a1,b1) } // if let a1=a && let b1=b { //error: expected ',' joining parts of a multi-clause condition // print(a1,b1) // }



guard let의 가독성이 더 좋다



수정된 코드
let anotherCharacter: Character = "a" switch anotherCharacter { case "a": // 실행문이 필요함 print("소문자 a") case "A": print("A글자") default: print("A글자 아님") }결과
소문자 a

let weight = 60.0
let height = 170.0
let bmi = weight / (height*height*0.0001)// kg/m*m
var body = ""
switch bmi {
case ..<18.5 :
body = "저체중"
case 18.5 ..< 25 :
body = "정상"
case 25 ..< 30 :
body = "1단계 비만"
case 30 ..< 40 :
body = "2단계 비만"
default :
body = "3단계 비만"
}
print("BMI:\(bmi),판정:\(body)")


var numbers: [Int] = [1, 2, 3, 4, 5]
for num in numbers where num > 3 {
print(num)
}
결과
4
5





func message(name: String, age: Int)-> String {
return("\(name) \(age)")
}


func add(x:Int, y: Int)-> Int {
return(x+y)
}
add(x:10,y:20)
print(type(of:add))
