μ λ€λ¦ (Generic)
μ λ€λ¦
π‘ μ λ€λ¦μ΄λ?
- ν¨μ, νμ λ° λ°μ΄ν° ꡬ쑰μ λν μ μ°νκ³ μΆμμ μΈ μ½λλ₯Ό μμ±ν μ μκ² ν΄μ£Όλ κΈ°λ₯
- λ€μν νμ μμ μλνλλ‘ μΌλ°νλ μ½λλ₯Ό μμ±ν μ μκ² ν΄μ€λ€.
- μ λ€λ¦μΌλ‘ ꡬνν κΈ°λ₯κ³Ό νμ μ μ¬μ¬μ©νκΈ°λ μ½κ³ , μ½λμ μ€λ³΅μ μ€μΌ μ μλ€.
- μ λ€λ¦μ μ¬μ©νκ³ μ ν λλ μ λ€λ¦μ΄ νμν νμ λλ λ©μλμ μ΄λ¦ λ€μ νμ΄κ΄νΈ κΈ°νΈ μ¬μ΄μ μ λ€λ¦μ μν νμ λ§€κ°λ³μλ₯Ό μ¨μ£Όμ΄ μ λ€λ¦μ μ¬μ©ν κ²μμ νμνλ€.
- μ λ€λ¦μ μ€μ νμ μ΄λ¦μ μ¨μ£Όλ λμ μ placeholderλ₯Ό μ¬μ©νλ€. [ eg: T, V, U ]
- placeholderλ νμ μ μ’ λ₯λ₯Ό μλ €μ£Όμ§ μμ§λ§ μ΄λ€ νμ μ΄λΌλ κ²μ μλ €μ€λ€.
- placeholderμ μ€μ νμ μ ν¨μκ° νΈμΆλλ μκ° κ²°μ λλ€.
- placeholderλ νμ λ§€κ°λ³μλ‘ μ°μΌ μλ μλλ°, μ΄ νμ λ§€κ°λ³μλ ν¨μλ₯Ό νΈμΆν λλ§λ€ μ€μ νμ μΌλ‘ μΉνλλ€.
- νλμ νμ λ§€κ°λ³μλ₯Ό κ°μ§ μκ³ μ¬λ¬ κ°μ νμ λ§€κ°λ³μλ₯Ό κ°κ³ μΆλ€λ©΄ ννμ΄κ΄νΈ κΈ°νΈ μμͺ½μ μΌνλ‘ λΆλ¦¬ν μ¬λ¬ κ°μ νμ λ§€κ°λ³μλ₯Ό μ§μ ν΄μ€ μ μλ€. [ eg: <T, U> ]
- μ λ€λ¦ νμ μ ꡬννλ©΄ ꡬ쑰체, ν΄λμ€, μ΄κ±°ν λ±μ΄ μ΄λ€ νμ κ³Όλ μ°κ΄λμ΄ λμν μ μλ€.
- μ λ€λ¦ νμ μ μ ν΄μ£Όλ©΄ κ·Έ νμ μλ§ λμνλλ‘ μ νν μ μμ΄ μμ νκ³ μλν λλ‘ κΈ°λ₯μ μ¬μ©νλλ‘ μ λν μ μλ€.
inout ν€μλ
/*
inout ν€μλλ ν¨μ λ΄μμ λ§€κ°λ³μλ‘ μ λ¬λ κ°μ λ³κ²½νκ³ ,
μ΄λ₯Ό ν¨μ μΈλΆμμλ λ°μν μ μλλ‘ νλ λ° μ¬μ©λλ€.
μ΄λ₯Ό ν΅ν΄ ν¨μ λ΄μμ λ§€κ°λ³μμ κ°μ μ§μ μμ ν μ μλ€.
inout ν€μλ μ¬μ© λ°©λ²:
1. λ§€κ°λ³μμ inout ν€μλλ₯Ό λΆμ¬ μ μΈνλ€.
2. ν¨μ νΈμΆ μ λ§€κ°λ³μλ₯Ό & κΈ°νΈλ‘ μ λ¬νμ¬ ν΄λΉ κ°μ μ°Έμ‘°λ‘ μ λ¬νλ€.
*/
// ν¨μ μ μ
func increment(_ value: inout Int) {
value += 1
}
var number = 5
print("Before increment: \(number)") // μΆλ ₯: Before increment: 5
// ν¨μ νΈμΆ μ λ§€κ°λ³μμ &λ₯Ό μ¬μ©νμ¬ λ³μμ μ°Έμ‘°λ₯Ό μ λ¬
increment(&number)
print("After increment: \(number)") // μΆλ ₯: After increment: 6
// λ λ³μμ κ°μ λ°κΏμ£Όλ ν¨μλ₯Ό νμ
λ³λ‘ μμ±ν΄μΌν¨(μ λ€λ¦ μ¬μ©νμ§ μλ κ²½μ°)
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoStrings(_ a: inout String, _ b: inout String) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
let temporaryA = a
a = b
b = temporaryA
}
// μ λ€λ¦μ μ¬μ©νλ©΄ νμ
μ μκ΄μμ΄ μ¬μ©κ°λ₯ν¨
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
ν(Queue), μ€ν(Stack)
struct Queue<T> {
private var queue: [T] = []
public var count: Int {
return queue.count
}
public var isEmpty: Bool {
return queue.isEmpty
}
public mutating func enqueue(_ element: T) {
queue.append(element)
}
public mutating func dequeue() -> T? {
return isEmpty ? nil : queue.removeFirst()
}
}
var queue = Queue<Int>() // λͺ¨λ Tκ° μΌμΉ
queue.enqueue(10) // intμ κ°λ§ λ£μ μ μλ€.
queue.enqueue(20)
queue.dequeue() // 10
struct Stack<T> {
private var stack: [T] = []
public var count: Int {
return stack.count
}
public var isEmpty: Bool {
return stack.isEmpty
}
public mutating func push(_ element: T) {
stack.append(element)
}
public mutating func pop() -> T? {
return isEmpty ? nil : stack.popLast()
}
}
var stack = Stack<Int>() // Tλ Intλ‘ κ³ μ
stack.push(10) // intμ κ°λ§ λ£μ μ μλ€.
stack.push(20)
stack.pop() // 20
λμ λ리 (Dictionary)
// λμ
λ리 μμ
@frozen public struct Dictionary<Key, Value> where Key : Hashable { // whereλ μ μ½μ‘°κ±΄(Keyμ κ²½μ°μλ Hashableμ λ°λ₯Έ νμ
λ§ λ€μ΄μ¬ μ μλ€.)
/// The element type of a dictionary: a tuple containing an individual
/// key-value pair.
public typealias Element = (key: Key, value: Value)
var fruitsInventory: Dictionary<String, Int> = [:]
fruitsInventory["apple"] = 3
/*
Key, Value νμ
μ μ λ€λ¦μΌλ‘ λμ΄μμ΄ μ°λ¦¬λ μνλ νμ
μΌλ‘ λμ
λ리λ₯Ό μμ±ν μ μμ
μ μ½μ‘°κ±΄μ Keyκ° Hashable νλ‘ν μ½λ§ λ°λ₯΄λ©΄ λλ κ²μ΄λ€
κΈ°λ³Έ μλ£νμΈ Stringμ Hashable νλ‘ν μ½μ λ°λ₯΄κ³ μμ
λ§μ½ λ€λ₯Έ μλ£νμ Keyλ‘ μ¬μ©νλ €λ©΄ Hashable νλ‘ν μ½μ μ±νν΄μΌ ν¨
*/
/*
where ν€μλλ 무μμΌκΉμ?
μ λ€λ¦μ μ μ½μ‘°κ±΄(Constraints)μΈ where ν€μλλ μ λ€λ¦ νμ
μ νΉμ 쑰건μ λΆμ¬νμ¬
ν΄λΉ μ μ½μ μΆ©μ‘±νλ νμ
λ§μ μ¬μ©ν μ μλλ‘ νλ κΈ°λ₯
where ν€μλλ₯Ό μ¬μ©νμ¬ μ λ€λ¦ νμ
μ νΉμ νλ‘ν μ½ μ±ν,
νΉμ νμ
κ³Όμ μμ κ΄κ³ λ±μ μ νν μ μλ€.
*/
// νλ‘ν μ½ μ±ν μ μ½ μμ
func process<T>(value: T) where T: Numeric {
// Numeric νλ‘ν μ½μ μ±ννλ νμ
λ§μ μ λ€λ¦ νμ
Tλ‘ λ°μ
print("Value is a numeric type.")
}
process(value: 5) // μΆλ ₯: Value is a numeric type.
process(value: 3.14) // μΆλ ₯: Value is a numeric type.
// process(value: "Hello") // μ»΄νμΌ μλ¬ - λ¬Έμμ΄μ Numeric νλ‘ν μ½μ μ±ννμ§ μκΈ° λλ¬Έμ μ¬μ©ν μ μλ€.
// ν΄λμ€μ μμ κ΄κ³ μ μ½ μμ
class MyClass {}
class MySubclass: MyClass {}
func process<T>(value: T) where T: MyClass {
print("Value is an instance of MyClass or its subclasses.")
}
let obj = MySubclass()
process(value: obj) // μΆλ ₯: Value is an instance of MyClass or its subclasses.
// process(value: "Hello") // μ»΄νμΌ μλ¬ - λ¬Έμμ΄μ MyClass λλ κ·Έ νμ ν΄λμ€κ° μλκΈ° λλ¬Έμ
'π Today I Learned > Swift λ¬Έλ²' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] RxSwift (0) | 2023.12.15 |
---|---|
[Swift] Combine (0) | 2023.12.15 |
[Swift] νμ₯ (Extension) (0) | 2023.12.13 |
[Swift] νλ‘ν μ½ (0) | 2023.12.13 |
[Swift] ARCμ λ©λͺ¨λ¦¬ λμ (0) | 2023.12.13 |