250x250
반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

스윞한 개발자

Swift 기초 문법 - reduce/Equatable/Zip/Range/open 본문

Swift 이론

Swift 기초 문법 - reduce/Equatable/Zip/Range/open

스윞남 2024. 1. 29. 00:43
728x90
반응형
SMALL

이번 시간에는 다양한 고차함수! 기초 문법에 대해 정리해보았습니다 ㅎㅎ

옛날 포스팅에서 정리한 고차함수 뿐만 아니라 훨씬 많은 종류의 고차함수가 많더라구요 차근차근 다 정리해볼게요!

 

 

reduce는 스위프트의 고차함수 중 하나로, 컬렉션(배열, 딕셔너리, 세트)의 요소들을 결합하거나 축소하여 하나의 결과값을 생성하는 함수입니다. 주로 초기값과 클로저를 활용하여 컬렉션 내의 요소들을 반복하면서 연산을 수행합니다.

reduce 기본 형식

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

initialResult : 연산의 초기값으로 사용될 값입니다.
nextPartialResult : 클로저로, 컬렉션의 각 요소와 이전 단계의 결과값을 받아 새로운 결과값을 반환하는 역할을 합니다.

배열 요소의 합 구하기

let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0) { (result, number) in
    return result + number
}
print(sum)  // 출력: 15

배열 요소의 곱 구하기

let numbers = [2, 3, 4, 5]
let product = numbers.reduce(1) { (result, number) in
    return result * number
}
print(product)  // 출력: 120

문자열 배열의 하나의 문자열로 결합하기

let words = ["Hello", "Swift", "Programming"]
let combined = words.reduce("") { (result, word) in
    return result + " " + word
}
print(combined)  // 출력: " Hello Swift Programming"

딕셔너리의 값을 합치기

let scores = ["Alice": 85, "Bob": 92, "Charlie": 78]
let totalScore = scores.reduce(0) { (result, keyValue) in
    let (_, score) = keyValue
    return result + score
}
print(totalScore)  // 출력: 255

참고(출처) : 개발하는 정대리, 야곰(Swift5>> 참고(출처) : 개발하는 정대리, 야곰(Swift5식)

 

Equatable

Equatable은 스위프트의 프로토콜 중 하나로, 두 개의 값이 같은지 비교하기 위해 사용되는 프로토콜입니다.

Equatable 프로토콜을 준수하는 타입은 '=='연산자를 사용하여 두 값을 비교할 수 있습니다.

struct Point: Equatable {
    var x: Int
    var y: Int
}

let point1 = Point(x: 2, y: 3)
let point2 = Point(x: 2, y: 3)
let point3 = Point(x: 4, y: 5)

print(point1 == point2)  // 출력: true
print(point1 == point3)  // 출력: false

 

Equatable을 준수하는 타입을 정의할 때는 두 값이 같은지 비교하기 위한 '=='연산자를 구현해야합니다.
스위프트는 기본타입들에 대해 이미 Equatable을 구현해두어서 사용자 정의 타입에 대해서도 비교를 지원할 수 있게 해줍니다.

struct Person: Equatable {
    var name: String
    var age: Int
}

let person1 = Person(name: "Alice", age: 30)
let person2 = Person(name: "Alice", age: 30)
let person3 = Person(name: "Bob", age: 25)

print(person1 == person2)  // 출력: true
print(person1 == person3)  // 출력: false

참고(출처) : 개발하는 정대리

 

Zip

zip은 스위프트의 내장 함수 중 하나로, 두 개 이상의 시퀀스를 조합하여 하나의 새로운 시퀀스를 생성하는 역할을 합니다.

zip함수를 사용하면 여러 시퀀스들을 병렬로 순회하며 요소들을 조홥할 수 있습니다. zip은 각 시퀀스에서 동일한 인덱스의 요소들을 묶어 새로운 튜플 시퀀스로 반환합니다.

zip(sequence1, sequence2, sequence3, ...)
let numbers = [1, 2, 3, 4, 5]
let strings = ["One", "Two", "Three", "Four", "Five"]

let zipped = zip(numbers, strings)

for (number, string) in zipped {
    print("\(number) is \(string)")
}

zip은 배열 뿐만 아니라 시퀀스라면 어떤 종류의 시퀀스든 조합할 수 있습니다.

let names = ["Alice", "Bob", "Charlie"]
let ages = [25, 30, 28]

let nameAgePairs = zip(names, ages)

for (name, age) in nameAgePairs {
    print("\(name) is \(age) years old")
}

참고(출처) : 개발하는 정대리, 야곰(Swift5)

 

Range

스위프트에서 Range는 연속적인 값의 범위를 나타내는 타입입니다. Range는 일반범위와 닫힌 범위로 나눌 수 있습니다. 주로 반복문이나 컬렉션에서 특정 범위의 값들을 다루거나 추출할때 사용됩니다.

1. 일반 범위

let range = 1..<5 // 1, 2, 3, 4
for number in range {
    print(number)
}

2. 닫힌 범위

let closedRange = 1...5 // 1, 2, 3, 4, 5
for number in closedRange {
    print(number)
}
let array = [10, 20, 30, 40, 50]
let subRange = 1..<4

for index in subRange {
    print(array[index]) // 20, 30, 40
}

문자열에서도 일부 문자들을 추출하거나 처리할 수 있습니다.

let text = "Hello, Swift!"
let startIndex = text.index(after: text.startIndex) // 첫 번째 문자를 제외한 시작 인덱스
let endIndex = text.index(before: text.endIndex)    // 마지막 문자를 제외한 끝 인덱스
let range = startIndex..<endIndex

let subText = text[range] // "ello, Swift"

참고(출처) : 개발하는 정대리, 야곰(Swift5)

 

 

Open

스위프트에서의 open은 접근 제어 수준 중 하나로, 클래스와 클래스 멤버를 상속받는 모듈 외부에서도 접근할 수 있도록 해주는 키워드입니다. open 접근 제어 수준은 가장 높은 접근 권한을 제공하며, 외부 모듈에서 클래스를 상속하고 해당 클래스의 메서드와 프로퍼티를 오버라이드할 수 있도록 허용합니다.

open class Vehicle {
    open var speed: Double

    public init(speed: Double) {
        self.speed = speed
    }

    open func startEngine() {
        print("Engine started")
    }

    open func stopEngine() {
        print("Engine stopped")
    }
}

// Vehicle 클래스를 상속받는 Car 클래스
open class Car: Vehicle {
    open var brand: String

    public init(speed: Double, brand: String) {
        self.brand = brand
        super.init(speed: speed)
    }

    open override func startEngine() {
        print("Car engine started")
    }

    open override func stopEngine() {
        print("Car engine stopped")
    }
}

Vehicle 클래스와 Car 클래스는 모두 open 접근 제어 수준으로 선언되었습니다. 선언된 클래스들은 다른 모듈에서 상속하거나 해당 클래스의 메서드와 프로퍼티를 오버라이드 할 수 있습니다.

 

open 접근 제어 수준은 상속과 오버라이딩을 위해 사용되므로, 프로젝트의 모듈을 정의할 때 신중하게 사용해야 합니다. 대부분의 경우에는 public 접근 제어 수준으로도 충분하며, 필요한 경우에만 open을 사용하여 접근 범위를 확장하는 것이 좋습니다.

참고(출처) : 개발하는 정대리, 야곰(Swift5)

728x90
반응형
LIST