함께 공부하는 팀에 관한 변동사항이 생겼다. 또한, 2주차에 들어오며 ios 프로그래밍에 관한 기초적인 문법, 알고리즘에 대해 공부를 시작한다.
기본적인 내용들과 알고있던, 쉬운 내용은 제외하고 공부했던 부분들 중 필수적인 이해가 요구되는 부분들만 발췌하여 기록한다.
고급 데이터 타입이지만 사실 고급이 아니다. 그저 매일 사용하는 일상 데이터 타입.
let closure: (파라미터, 파라미터) -> 반환타입
Trailing Closure
func trailingTest(key: String, closure: () -> Void) {
print(key)
closure()
}
trailingTest(key: "Key name", closure: { // 원래는 이렇게 만들어야 하지만 아래처럼 가능
print("Hello")
})
trailingTest(key: "Hello") {
print("World")
}
본인의 생각으로는 Closure과 Optional에 대한 이해가 Swift 문법에 관한 이해의 척도를 나타낼 수 있을 것 같다. 문법 공부를 위해 항상 공식 문서를 참고하고자 한다. 기타 블로그도 참고하지만, 공식 문서에 더 비중을 둡니다.
ref. https://bbiguduk.gitbook.io/swift/language-guide-1/closures
팀을 변경하게되고 받게된 첫 과제이다. 팀프로젝트가 아닌 개인 과제이며, 문제는 필수 5개와 도전 4개로 총 9개이다. 문제를 풀어가는 능력도 중요하지만, 정확한 개념에 대한 숙지를 통해 제대로 문제에 접근하는 것이 가장 중요하다 생각한다. 때문에, 과제는 급하게 접근하지않고 강의를 수강한 후 개념의 정리가 되었을 때, 천천히 풀어보고자 한다. 오늘 풀어본 문제는 필수 문제1, 문제2이다.
문제 1.
- 두 개의 Int 값을 파라미터로 받고, 하나의 String 값을 반환하는 클로저를 설계해주세요.
- 클로저 내부에서는 두 정수를 더한 후, "두 수의 합은 {합계} 입니다"라는 문자열을 반환합니다.
- 이 클로저를 상수 sum에 저장하고, 정확한 타입을 명시해주세요.
var num: Int = 3- sum을 호출하는 코드를 작성해주세요. (파라미터로 전달하는 값은 임의로 선택)
- 위에서 정의한 sum과 동일한 타입의 클로저를 파라미터로 받고, 반환 값이 없는(void) 함수 calculate를 작성해주세요.
- (조건) calculate 함수 구현 내에서는 파라미터로 전달받은 클로저를 호출하는 코드를 포함해야합니다.
/* 1. 두 개의 Int 값을 파라미터로 받고, 하나의 String 값을 반환하는 클로저*/
let closure: (Int, Int) -> String = {
val1, val2 in
return "두 수의 합은 \(val1 + val2)입니다."
}
//let closure: (Int, Int) -> String = {
// return "두 수의 합은 \($0 + $1)입니다."
//}
//print(closure(10,20))
/* 2. 클로저를 상수 sum에 저장하고, 정확한 타입을 명시*/
let sum: (Int, Int) -> String = {
val1, val2 in
"두 수의 합은 \(val1 + val2)입니다."
}
//let sum: (Int, Int) -> String = {"두 수의 합은 \($0 + $1)입니다."}
/* 3. sum을 호출하는 코드*/
print(sum(10,20))
/* 4. sum과 동일한 타입의 클로저를 파라미터로 받고, 반환 값이 없는(void) 함수 calculate */
func calculate(calClosure: (Int, Int) -> String){
let result = calClosure(10,20)
print(result)
}
calculate(calClosure : sum)
아래의 두 코드(주석처리된 부분, 주석처리 되지 않은 부분)는 동일한 코드이지만, 연습을 위해 매개변수에 명시적으로 이름을 지정해주는 방법1, 단축어를 사용하는 방법2로 구현했다.
let closure: (Int, Int) -> String = {
val1, val2 in
return "두 수의 합은 (val1 + val2)입니다."
}
//let closure: (Int, Int) -> String = {
// return "두 수의 합은 ($0 + $1)입니다."
//}
위 문제는 요구사항을 읽고 그대로 따라가다보면 완성할 수 있는 문제로 난이도 자체는 높지않았기에 특별히 분석할 부분이 없다고 생각한다.
문제 2.
- 아래 for-in 문을 map 을 사용하는 코드로 변환해주세요.
let numbers = [1, 2, 3, 4, 5] var result = [String]() for number in numbers { result.append(number) }- 주어진 입력값을 고차함수를 체이닝하여 주어진 출력값이 나오도록 구현해주세요.
- 입력: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - 타입: Array
- 출력: [”2”, “4”, “6”, “8”, “10”] - 타입: Array
- 힌트
map 과 filter 를 이용해볼 수 있을 것 같습니다.- 이제 고차함수를 직접 만들어 봅니다.
- 함수명: myMap
- 파라미터는 2개 입니다.
- 배열: [Int]
- 변환 클로저: (Int) → String
- 반환 값은 1개 입니다.
- [String]
- myMap 함수 구현 내부에서 map, filter, reduce 등 고차함수를 직접 사용하지 않아야합니다.
- 완성된 myMap 호출 예시
let result = myMap([1, 2, 3, 4, 5]) { String($0) } print(result) // ["1", "2", "3", "4", "5"] ```*/
/* 1. for-in -> map 변경*/
let numbers = [1, 2, 3, 4, 5]
var result = [String]()
result = numbers.map{String($0)}
print(result)
/* 2. 고차함수 체이닝 */
let num:[Int] = [1,2,3,4,5,6,7,8,9,10]
var res:[String] = num.filter{$0 % 2 == 0}.map{String($0)}
print(res)
/* 3. 고차함수 생성 (map, filter, reduce 사용X */
func myMap(arr:[Int], toString: (Int) -> String) -> [String]{
var myres: [String] = []
for idx in arr{
myres.append(toString(idx))
}
return myres
}
let arr2 = myMap(arr: [1,2,3,4,5]){
String($0)
}
print(arr2)
크게 어려운 부분은 없었다.
모든 문제는 여러 해설이 나타날 수 있으며, 이 점이 프로그래밍을 하는 즐거움이라 생각한다.(절대적인 정답은 없다) 본인은 생각하지 못한 다른 방식의 접근을 공유하고 코드의 품질을 높이기 위해 아주 조금의 도전적인 생각들이 모여 나타나는 결과물에 즐거움을 느끼며 공부한다.