제네릭 함수
Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 34번째.
제네릭 함수는 어떤 타입과도 함께 작동합니다. 꺾쇠괄호 안의 자리 표시자(흔히 T)는 호출자가 사용하는 타입을 나타내며, Swift는 각 호출 시 이를 채웁니다:
func firstAndLast<T>(_ items: [T]) -> [T] {
guard let first = items.first, let last = items.last else { return [] }
return [first, last]
}
print(firstAndLast([3, 8, 1]))
print(firstAndLast(["a", "b", "c"]))출력:
[3, 1]
["a", "c"]함수 내부에서는 T에 대해 아무것도 알 수 없으므로 모든 타입에 대해 작동하는 연산만 허용됩니다. T: Comparable과 같은 제약 조건을 사용하면 더 많은 연산을 허용할 수 있으며, 여기서는 < 연산자를 사용할 수 있습니다:
func largest<T: Comparable>(_ items: [T]) -> T? {
guard var best = items.first else { return nil }
for item in items where item > best { best = item }
return best
}
print(largest([4, 9, 2])!)
print(largest(["pear", "apple", "zucchini"])!)출력:
9
zucchini제네릭은 Any와 달리 정확한 타입을 유지합니다. [Int]에 대한 largest의 결과는 Int?이므로 캐스팅 없이 산술 연산에 사용할 수 있습니다:
func largest<T: Comparable>(_ items: [T]) -> T? {
items.max()
}
let top = largest([3, 7, 5]) ?? 0
print(top * 10)출력:
70함수에는 여러 개의 자리 표시자가 있을 수 있으며, 제약 조건에서 직접 만든 프로토콜의 이름을 지정할 수도 있습니다:
protocol Scored { var score: Int { get } }
struct Player: Scored { let name: String; let score: Int }
struct Team: Scored { let score: Int }
func total<T: Scored>(_ items: [T]) -> Int {
items.reduce(0) { $0 + $1.score }
}
func pair<A, B>(_ a: A, _ b: B) -> String { "\(a) & \(b)" }
print(total([Player(name: "a", score: 3), Player(name: "b", score: 4)]))
print(total([Team(score: 10)]))
print(pair(1, "one"))출력:
7
10
1 & one챌린지
쉬움모든 타입의 배열과 조건자 (T) -> Bool를 받아 조건을 통과하는 요소의 개수를 반환하는 제네릭 함수 countWhere(_:_:)와, 모든 Hashable 타입의 배열을 받아 가장 자주 나타나는 요소(횟수가 같으면 배열에서 먼저 나타나는 요소)를 반환하는 mostCommon(_:)을 작성하세요. 빈 배열의 경우 nil을 반환합니다.
제공된 코드는 쉼표로 구분된 단어 한 줄과 숫자 한 줄을 읽습니다. 3자보다 긴 단어의 개수, 가장 흔한 단어, 짝수의 개수, 가장 흔한 숫자를 출력합니다.
코드는 Functions.swift에 작성하세요. main.swift에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
// 제공된 입력/출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
let words = input[0].split(separator: ",").map(String.init)
let numbers = input[1].split(separator: ",").map { Int($0)! }
print(countWhere(words) { $0.count > 3 })
print(mostCommon(words) ?? "none")
print(countWhere(numbers) { $0 % 2 == 0 })
print(mostCommon(numbers).map { String($0) } ?? "none")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드