궁금한 내용을 검색해보세요!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
서근 개발노트
티스토리에 팔로잉
SWIFT/Grammar

Swift: 주요 함수 [max, min, numericCast, precondition, preconditionFailure, print]

서근
QUOTE THE DAY

-
Written by SeogunSEOGUN

반응형

스위프트의 주요 함수 모음

기초문법을 알아가면서 궁금했던 각각의 함수의 정의를 살펴보고자 한다. 이 게시글 외에 Swift 문서를 참고하면 함수의 정의 및 설명 또한 쉽게 파악할 수 있으니 Swift 문서를 읽어보는 것을 추천한다!

TIP
 
 

스위프트 관련 기술 문서 사이트
스위프트 문서 (영문) 추천
스위프트 블로그
스위프트 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[각주:1] 프로토콜을 준수하는 타입이라면 max(), 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 면 현재 프로그램 상태가 불안정 하다고 판단되어서 코드 실행이 멈추고 앱이 종료된다.

 

preconditionsproduction에서 이슈를 발견하는 데 도움이 된다. 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이 발생했음을 나타낼 수 도 있다.

print

정의

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"

 

 

읽어주셔서 감사합니다🤟

 

 

  1. Comparable 프로토콜은 관계 연산자(<. <=, >=, > 등)을 사용해 비교할 수 있는 타입이다. 숫자나 문자열처럼 순서를 갖는 타입에 사용하기 적합하다. 스위프트 표준 라이브러리의 대부분의 타입은 Comparable 프로토콜을 준수한다 [본문으로]

잘못된 내용이 있으면 언제든 피드백 부탁드립니다.


서근


위처럼 이미지 와 함께 댓글을 작성할 수 있습니다.