Schedule
1100 기상
1100 ~ 1200 : 샤워 & 식사
1200 ~ 1230 : 도서관 출근
1230 ~ 1400 : Spotify Clone Coding Lecture 1
1400 ~ 1550 : Spotify Clone Coding Lecture 2
1550 ~ 1610 : 산책 & 간식 충전
1610 ~ 1830 : 앨런 swift bootcamp 강의
1830 ~ 1930 : 귀가 & 식사 및 휴식
1930 ~ 2100 : 수영장으로 이동 & 수영
2100 ~ 2130 : 신문 읽으며 휴식
2130 ~ 2200 : 휴식
2200 ~ 2300 : 앨런 swift bootcamp 강의
Total 공부시간 : 7시간
Feedback
늦게 일어난 게 아쉽지만, 그래도 시간을 알차게 쓴 하루.
특히 Clone Coding 하는 게 재밌었다.
아직 잘 알지 못하지만, iOS를 잘 선택했음을 느낄 수 있었던 순간이 있던 하루였다.
일찍 일어나서 수영하고 도서관 출근해서 끝까지 공부할 수만 있다면 더없이 좋겠다.
습관을 들여보자!
Today I Learned
Lecture 1
StoryBoard 를 제거하고, AppDelegate 와 SceneDelegate를 수정함으로써
화면을 꾸미는 방식으로 진행하고 있다.이번 수업에서는 App/Scene Delegate에서 ViewController 들을 호출해, ViewController 에서 세부 logic을 채움으로써 프로그램을 짜는데,
들을 경험해보았다.
> Lecture 2
```swift
이번 수업에서는 Spotify API를 끌어다와서 Authorization 을 진행했다.
우선 Authorization 화면을 AuthViewController를 수정함으로써 만들었고,
Sptify API에 접근하여 URL을 parsing 해서 해당화면과 이어주었다.
API를 활용하는 경험을 해볼 수 있었던 것 같은데,
내 페이지에서는 강사의 화면 페이지를 접근할 수가 없어서 많이 헤메었다.
Lecture 1
1. argument Labelfunc printName(first name: String){ print("my name is \(name) !") }
print(first: Han)
-> first를 argument Label 이라고 한다.
함수 호출시 어떤 argument 를 넘기는지 길게 쓸 수 있어 편리하다!
2. 와일드카드 패턴을 사용할 수도 있다.
```swift
func addPrintFunction(_ firstNum: Int, _ secondNum: Int){
print(firstNum + secondNum)
}
addPrintFunction(3,4)
-> 와일드카드 패턴을 사용해서 argument label 을 생략해서 사용할 수도 있다!!
func arithmeticAverage(_ numbers: Double ...) -> Double{
var total = 0.0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticAverage(1)
arithmeticAverage(1,3)
arithmeticAverage(1.5,3.5,4.5) ....
-> 함수의 파라미터가 몇 개인지 정해지지 않았을 때, type만 정해놓고서 argument들을 받는다
(Type) ... : 를 가변파라미터라고 한다.
func numFunction(num1: Int, num2: Int =5) -> Int{
var result = num1 + num2
return result
}
numFunction(num1: 3) -> 3+5 가 return 될 것
numFunction(num1: 3, num2: 7) -> 3+7 이 return 될 것
Ex : Print 함수도 기본값이 정해진 것과 똑같다.
print("내용",separator:"",terminator:"\n")
print(items: Any ..., separator: String, terminator: String) 이 원형이다!
-> 별다른 수정값이 들어오지 않으면 argument를 기본값으로 사용
Lecture 2
1. 함수의 파라미터에 대한 정확한 이해func someAdd(a: Int) -> Int{ // let a 로 선언되어있음. 따라서 내부에서 var b = a 로 받아주는 방식으로 a값을 변경시킨다. }
someAdd(a: 5)
2. 함수 내의 변수의 scope(스코프)
```swift
함수 내에서 선언한 변수의 Scope는 함수의 바디로 제한된다는 거. (당연)
함수를 호출하는 것은 자체로 표현식. 함수 내에서 return 나오면 함수 종료 (당연)
func chooseStepFunction(backward: Bool, value: Int) -> Int{
func stepForward(input: Int) -> Int{
return input +1
}
func stepBackward(input: Int) -> Int{
return input -1
}
if backward{
return stepBackward(input: value)
}
else{
return stepForward(input: value
}
}
Swift에서는 함수 내에 함수를 새로 정의해서 호출할 수도 있다.
당연히 함수 내부에서만 살아있는 함수로 취급된다.
Lecture 3
1. 함수 표기법doSomething(){ print("SomeThing") }
var some = doSomething : 변수에 함수를 저장할 수 있다.
some() == doSomething() : 동일하게 동작한다
-> 함수 표기법
1. 파라미터가 없는경우 : 그냥 함수 이름을 호출해서 가리킨다.
2. 파라미터가 있는 경우 : 파라미터의 값 부분을 지운다.
Ex. addNumber(n num: Int){
return n+1
}
addNumber(n:) : 이렇게 함수를 가리킨다.
3. argument label이 생략된 경우(와일드카드 패턴): addPrintFunction(::) 로 가리킨다.
chooseStepFunction(backward:value:) : chooseStepFunction-backward-value 함수
라고 부른다.
2. 함수 타입의 표기법
```swift
var function1 = numberPrint(n:)
var function1 : (Int) -> () = numberPrint(n:)
(Int) -> Void
var function2 : (Int, Int) -> (Int) = numberPrint(n:)
func doSomething(value: Int){
print(value)
}
func doSomething(value: Double){
print(value)
}
func doSomething(value: String){
print(value)
}
func doSomething(value1: String, value2: String){
print(value1,value2)
}
func doSomething(value1: String, value2: Int){
print(value1,value2)
}
-> 함수 이름 하나에 여러 파라미터 형태가 대응되도록 오버로딩을 할 수 있다.
컴파일러는 함수 이름, 파리미터 수/자료형, 아규먼트 레이블, 리턴형 등을 모두 포함해서 구분해준다.
Command + I 를 누르면, 컴파일러가 자동으로 줄을 맞춰준다.
break
continue
fallthrough: switch 문에서 사용할 수 있다. 실행한 뒤 다음 케이스도 실행시켜줌.
throw : 에러와 관련되어 있음
Lecture 4
1. 함수 실행의 메모리 구조
시스템프로그래밍에서 배웠던 내용을 좀 더 쉽게, 그림으로 배울 수 있었다.
Q. 전역변수는 어디에 저장되는가?
-> 데이터 영역에 저장된다. (아 맞다!)
코드 : 모든 코드가 메모리에 올라가고, 한 문장씩 실행 !
데이터 : 전역변수 저장 / 공유영역 -> 스택에서 접근 가능
힙 :
스택: 스택프레임 / 함수의 범위 : 스텍프레임과 데이터 영역 (외부에서 접근 불가능)
if - else 문 : jump!
for문 : 되돌아간다.
Lecture 5
1. inout 파라미터Swift의 함수 내 파라미터는 기본적으로 call by value 형식이고 임시상수라서 변경 불가하다.
But
inout 키워드가 함수 내에서 변수를 직접 수정하도록 돕는다. :
Call by reference 형식으로, 주솟값이 전달된다. 즉 원본이 전달된다
Pointer 같은 개념인 것 같다. (copy-in,copy-out)
func swapNumber(a: inout Int, b: inout Int){
var temp = a
a = b
b = temp
}
swapNumber(a: &num1, b: &num2)
⚠️inout 키워드를 사용해서 가변 파라미터로 선언하는 건 불가능함.
2. Guard 문
```swift
Swift에서만 유일한 조건문: if문이 여러개 있을 때 코드의 가독성이 문제되는 걸, 극복해줌.
func checkNumbersOf1(password: String) -> Bool{
if password.count >=6{
}
else{
return false
}
print("pass")
}
VS
func checkNumbersOf2(password: String) -> Bool{
guard password.count>=6 else { return false }
print("pass")
}
statement 를 만족하지 않으면 먼저 else 문을 실행시킴.
else 문 안에는 **early exit** 조건이 필요하다! ( return, throw, break, continue )
함수에서 쓰일 경우 return,throw 가,
반복문에서 쓰일 경우 break, continue 가
반드시 들어가야 한다.
가드문에서 선언된 변수를 아래 문장에서 사용가능함. 즉 동일한 스코프로 취급함.
사용 이유:
(1) 가독성을 높임 / if문의 불편함을 해소
(2) 여러개의 옵셔널 타입을 안전하게 벗기기 가능 - 추후 설명 예정
선언에 추가정보 제공: Ex : @available
타입에 추가정보 제공: Ex : @escaping
등 @가 붙는 걸 Attribute 키워드라고 한다.
func sayHello(){
print("안녕하세요")
}
func sayHelloString() -> String{
print("하이")
return "안녕하세요"
}
_ = sayHelloString() : 이렇게 해서 warning을 제거함 (~Swift ver4 패턴)
@discardableResult
func sayHelloString() -> String{
print("하이")
return "안녕하세요"
}
: 이 함수의 결과물은 버릴수도 있는 결과야! 라고 컴파일러에게 알려줌 -> waring 제거