문제에서 요구사항이 "함수 c 에 Numbers 프로토콜 요소를 가진 배열만 사용할 수 있는 함수 d 를 작성해주세요."였다.
엥? 배열 내 요소에 프로토콜 준수를 시킨다는건 대충 알겠지만 뭐 어떤 내용에 대한 준수를 하도록 할 것이며... 등등 의문이 좀 있었는데 어쨋든 구현을 해보기로 한다.
import Foundation
protocol Numbers {
var intValue: Int? { get }
}
class ThirdQuestion {
func removeEvenNum(_ array: [Int]) -> [Int] {
var result: [Int] = []
for i in 1...array.count {
// 홀수 요소를 따로 빼도록 하여 기존 요소 중 짝수만 없도록 처리
if i % 2 != 0 {
result.append(array[i-1])
}
}
return result
}
func removeEvenString(_ array: [String]) -> [String] {
var result: [String] = []
for i in 1...array.count {
if i % 2 != 0 {
result.append(array[i-1])
}
}
return result
}
// 위 함수들을 제네릭을 이용해 타입을 유연하게 하여 하나의 함수로 대체
func removeEven<T> (_ array: [T]) -> [T] {
var result: [T] = []
for i in 1...array.count {
if i % 2 != 0 {
result.append(array[i-1])
}
}
return result
}
func removeEvenWithNumbers<T: Numbers> (_ array: [T]) -> [T] {
let result = array.enumerated().compactMap { (index, element) in
return index % 2 == 0 ? element : nil
}
return result
}
func printNumbers(numbers: [Numbers]) {
let values = numbers.compactMap { $0.intValue }
print(values)
}
}
struct Number<T>: Numbers {
var num: T?
var intValue: Int? {
if let doubleValue = num as? Double {
return Int(doubleValue)
} else if let floatValue = num as? Float {
return Int(floatValue)
} else if let intValue = num as? Int {
return intValue
}
return nil
}
}
대충 수정 전 코드다. (계속 리팩토링 해가면서 단계별로 커밋해 히스토리화할 예정)
let firstExample: [Number] = [
Number(num: 1),
Number(num: 3.5),
Number(num: 7),
Number(num: 6.6),
Number(num: 10.4),
Number(num: 3.14),
]
let filteredNumbers = thirdQuestion.removeEvenWithNumbers(firstExample)
print(filteredNumbers
이를 여기서 가져다가 썼는데,,,,
intValue 연산 당시 옵셔널로 리턴해주기 때문에 이를 풀어줘야 했음,,
이럴 때 쓰는 함수..! compactMap.
에.. 짤이 웃겨서 가져왔는데 ㅋㅋ 마지막 컷에 나오는 non-nil을 돌려주는 compactMap함수를 쓰도록 할것입니다.~
우선 저 안에 있는 num 값이 intValue로 들어가있을거라, 그 intValue 값들을 따로 모아야 함
func printNumbers(numbers: [Numbers]) {
let values = numbers.compactMap { $0.intValue }
print(values)
}
해당 함수를 보면 numbers라는 이름의 배열로 추출하고자 하는 배열을 받도록 해서 각 요소의 intValue를 모아 values에 저장하도록 함
그렇게 values를 print하도록 해 추출된 intValue를 출력한다! 이거임
해당 함수가 생겼으니.. 이를 써야 제대로된 로그를 띄울 수 있다
let firstExample: [Number] = [
Number(num: 1),
Number(num: 3.5),
Number(num: 7),
Number(num: 6.6),
Number(num: 10.4),
Number(num: 3.14),
]
let filteredNumbers = thirdQuestion.removeEvenWithNumbers(firstExample)
thirdQuestion.printNumbers(numbers: filteredNumbers)
아까 그 파트를 조금 수정해서 printNumbers를 처리하도록 함
그럼 결국 firstExample에 들어간 숫자들은 Int부터 Double까지 있는데 해당 값들을 removeEvenWithNumbers에서 인덱스에 따라 짝수 요소들을 빼주고 새롭게 나온 배열을 compactMap을 이용해 non-nil 처리 후 print하도록 함
코드 블럭 기본 세팅이 너무 보이지 않게 되어있어서 빨리 바꿀 필요가 있다....
'iOS > Swift' 카테고리의 다른 글
[TIL / 25.03.19] playground, command line tool에서의 비동기 함수 (feat. escaping closure) (2) | 2025.03.19 |
---|---|
[TIL / 25.03.18] 최적화(OptimizationTips) 1 (5) | 2025.03.18 |
[TIL / 25.03.13] 의존성 주입 (Dependency Injection) (0) | 2025.03.13 |
[TIL / 25.03.12] Alamofire Interceptor에 관한 문제 해결 (0) | 2025.03.12 |
[TIL / 25.03.11] 에러 핸들링(Error Handling) (2) | 2025.03.11 |