스위프트의 주요 함수 모음
기초문법을 알아가면서 궁금했던 각각의 함수의 정의를 살펴보고자 한다. 이 게시글 외에 Swift 문서를 참고하면 함수의 정의 및 설명 또한 쉽게 파악할 수 있으니 Swift 문서를 읽어보는 것을 추천한다!
스위프트 관련 기술 문서 사이트
스위프트 문서 (영문) 추천
스위프트 블로그
스위프트 Language Guide(한국어)
Swift 표준 라이브러리에서 기본적으로 제공하는 함수에 대해 알아볼까 한다. 해당 함수들은 전역 함수 이므로 새로운 함수를 정의할 때 이름이 중복되지 않도록 주의해야 한다.
max
정의
//비교 가능한 두 값 중 큰 값을 반환한다.
func max<T>(_ x: T, _ y: T) -> T where T : Comparable
//전달된 가장 큰 인수를 반환한다.
func max<T>(_ x: T, _ y: T, _ z: T, _ rest: T) -> T where T : Comparable
전달 인자 중에 가장 큰 값을 반환한다. 만약 동일한 값이 있다면 제일 마지막의 값을 반환한다.
배열의 예로 들자면, 배열의 요소가 Comparable
프로토콜을 준수하는 타입이라면 1max()
, min()
메서드를 활용하여 최대, 최솟값을 찾을 수 있다.
반환 값은 옵셔널 요소이므로 언래핑하여 사용하면 된다.
Comparable
프로토콜을 준수하지 않는 요소일 경우 컴파일 에러를 발생하고, 빈 배열에서 사용하면 nil
을 반환한다.
var numbers = [1,2,3]
print(numbers.min()) // Optional(1)
print(numbers.max()) // Optional(3)
var numbers = [Int]()
print(numbers.min()) // nil
print(numbers.max()) // nil
var objects = [CustomClass]()
print(objects.min()) // [!] Compile Error
print(objects.max()) // [!] Compile Error
min
정의
func min<T>(_ x: T, _ y: T) -> T where T : Comparable
전달인자 중에 가장 작은 값을 반환한다. 만약 동일한 값이 있다면 제일 처음의 값을 반환한다.
numericCast
정의
public func numericCast<T : BinaryInteger, U : BinaryInteger>(_ x: T) -> U {
return U(x)
}
정수 타입의 값을 다른 크기의 정수 타입으로 반환해준다. 오버플로가 발생할 경우 런타임 오류가 발생한다.
BinaryInteger
프로토콜은 숫자들이 언어 안에서 어떻게 작동되고 있는지 검사하기 위한 함수이다. BinaryInteger
는 signed
, unsigned
에 상관없이 모든 모양과 모든 사이즈의 정수를 다루는 하나의 통합된 인터페이스를 제공한다.
예를 들어 signed
정수의 배열과 unsigned
정수의 배열이 있고 같은 값으로 초기화됐다고 해보자
let arrayOfInt: [Int] = [1, 2, 3]
let arrayOfUInt: [UInt] = [1, 2, 3]
이 두 인스턴스는 같아 보일지 몰라도 다음과 같은 상황을 마주할 수도 있다.
arrayOfInt as [UInt] // 에러: `[Int]` 타입을 `[UInt]` 타입으로 강제로 바꿀 수 없습니다
이를 해결 하기 위한 한 가지 방법은 map(_:) 메서드에 numericCast
함수를 인자로 넘기는 것이다.
arrayOfInt.map(numericCast) as [UInt]
precondition
정의
func precondition(_ condition: @autoclosure () -> Bool,
_ message: @autoclosure () -> String = String(),
file: StaticString = #file, line: UInt = #line)
preconditions
은 런타임에 체크된다. 추가 코드를 실행시키기 전에 필수 조건을 만족시켰는지 검증하는 용도로 사용할 수 있다.
precondition
의 조건이 true
면 코드는 계속 실행되고, false
면 현재 프로그램 상태가 불안정 하다고 판단되어서 코드 실행이 멈추고 앱이 종료된다.
preconditions
는 production
에서 이슈를 발견하는 데 도움이 된다. preconditions
은 복구 가능한 에러 또는 예상되는 오류를 위해 사용되는 것이 아니다.
preconditions
사용은 런타임 에러가 발생하면 앱이 종료되므로 문제를 파악하기 더 쉽다. 또한 실행을 중지하는 것은 잘못된 상태로 인해 발생할 수 있는 손상을 제한하는 데도 도움이 된다.
조건이 false
일 가능성이 있을 때마다 precondition
을 사용할 수 있고 다음 코드를 실행하려면 조건은 반드시 true
여야 한다. 예를 들어 subscript
가 범위를 벗어나지 않았는지, function
이 유요한 값을 전달받았는지 확인할 때 쓸 수 있다.
precondition(_:_:file:line:)
에 조건과 조건의 결과가 false
일 경우 표시할 메시지를 넘길 수 있다.
// In the implementation of a subscript...
precondition(index > 0, "Index must be greater than zero.")
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
precondition(1==2)
//preconditionFailure()
}
}
preconditionFailure
정의
func preconditionFailure(_ message: @autoclosure () ->
String = String(), file: StaticString = #file, line: UInt = #line) -> Never
preconditionFailure(_:file:line:)
함수를 호출해서 failure
이 발생했음을 나타낼 수 도 있다.
정의
func print(_:separator:terminator:)(_ items: Any, separator: String = " ", terminator: String = "\n")
items
의 텍스트 표현을 표준 출력 또는 output
에 작성한다.
print("One two three four five")
// Prints "One two three four five"
print(1...5)
// Prints "1...5"
print(1.0, 2.0, 3.0, 4.0, 5.0)
// Prints "1.0 2.0 3.0 4.0 5.0"
출력할 때 자동 줄 바꿈을 원하지 않는다면 terminator
의 값으로 ""
을 전달하면 된다.
for n in 1...5 {
print(n, terminator: "")
}
// Prints "12345"
공백이 아닌 다른 항목으로 구분된 항목을 출력하려면 separator
의 값으로 원하는 값을 넣어주면 된다.
print(1.0, 2.0, 3.0, 4.0, 5.0, separator: " ... ")
// Prints "1.0 ... 2.0 ... 3.0 ... 4.0 ... 5.0"
읽어주셔서 감사합니다🤟
- Comparable 프로토콜은 관계 연산자(<. <=, >=, > 등)을 사용해 비교할 수 있는 타입이다. 숫자나 문자열처럼 순서를 갖는 타입에 사용하기 적합하다. 스위프트 표준 라이브러리의 대부분의 타입은 Comparable 프로토콜을 준수한다 [본문으로]
'SWIFT > Grammar' 카테고리의 다른 글
Swift : 고급문법 [ARC 메모리 관리 1 - 강한 참조] (0) | 2022.02.10 |
---|---|
Swift: 기초문법 [데이터 타입 - Int와 UInt (feat.카멜케이스)] (4) | 2022.02.09 |
Swift: 주요 함수 [abs, assert, assertionFailure, debugPrint, dump, fatalError] (0) | 2022.02.08 |
Swift : 스위프트의 주요 프로토콜 모음(설명) (0) | 2022.02.07 |
Swift : 고급 문법 [where 절 - 특정 패턴과 결합] (0) | 2022.02.07 |