일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 토이프로젝트
- 대표
- collectionview
- RxSwift
- 디자인 패턴
- 협업
- 반응형
- 기초문법
- 이론
- ios
- CS
- struct
- SwiftUI
- async
- 딕셔너리
- 실습
- 스트럭트
- 네트워크
- swift
- WeatherKit
- 프로토콜
- AppStore
- 세종대학교
- forEach
- uikit
- MVVM
- 구름톤 유니브
- 앱개발
- mvc
- 학과별커뮤니티
- Today
- Total
스윞한 개발자
Swift 기초 문법 - reduce/Equatable/Zip/Range/open 본문
이번 시간에는 다양한 고차함수! 기초 문법에 대해 정리해보았습니다 ㅎㅎ
옛날 포스팅에서 정리한 고차함수 뿐만 아니라 훨씬 많은 종류의 고차함수가 많더라구요 차근차근 다 정리해볼게요!
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)
'Swift 이론' 카테고리의 다른 글
Swift 기초 문법 - singleton 패턴 (0) | 2024.01.29 |
---|---|
Swift 기초 문법 - struct 기본 생성자 (0) | 2024.01.29 |
Swift 기초 문법 - 콜렉션 합치기/콜렉션간 변형 (0) | 2024.01.29 |
Swift 기초 문법 - dictionary grouping/Convenience init (0) | 2024.01.29 |
IOS AVFoundation (0) | 2024.01.27 |