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

Swift: 주요 함수 [abs, assert, assertionFailure, debugPrint, dump, fatalError]

서근
QUOTE THE DAY

-
Written by SeogunSEOGUN

반응형

스위프트의 주요 함수 모음

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

TIP
 
 

스위프트 관련 기술 문서 사이트
스위프트 문서 (영문) 추천
스위프트 블로그
스위프트 Language Guide(한국어)

Swift 표준 라이브러리에서 기본적으로 제공하는 함수에 대해 알아볼까 한다. 해당 함수들은 전역 함수 이므로 새로운 함수를 정의할 때 이름이 중복되지 않도록 주의해야 한다.

abs

정의

@inlinable public func abs<T>(_ x: T) -? T where T : comparable, T : SignedNumeric

전달 인자로 전달받은 값의 절대 값을 반환하는 함수이다.

var num = -2 // -2
//절댓값을 구해준다.
num = abs(num) // -2

let number = -15 // -15
let absolute = abs(number) // 15

var x = Int8.min
// x == -128
let y = abs(x)
// Overflow error
// 'x'의 절대값은 같은 유형으로 표현 가능해야 한다. 특히, 부호 있는 고정 너비 정수형의 최소값의 절대값은 표현할 수 없다.

assert

정의

func assert(_:_:file:line:)(_ condition: @autoclosure () -> Bool, _ message:
@autoclosure () -> String = String(), file: StaticString = #file, line: UInt = #line)

전통적인 C 스타일의 Assert를 위해 제공하는 함수이다. 실제 배포하는 빌드에서는 전혀 영향을 미치지 않으므로 실제 배포하는 코드에는 precondition 함수를 사용하는 것이 좋다.

 

assert(_:_file:line:) 함수를 사용하고, 디버깅 모드에서만 동작한다. 또, 배포하는 애플리케이션에서는 제외된다. 일반적으로 예상했던 조건의 검증을 위하여 사용한다.

var someInt: Int = 0
assert(someInt == 0, "someInt != 0")
//위 조건이 부합 하므로 지나간다.

//someInt 가 1이면 조건에 부합하지 않으므로 지나가지 않고
//몇번 째 줄에서 부합하지 않는지 출력한다.
someInt = 1
assert(someInt == 0, "someInt != 0")

//Assertion failed: someInt != 0: file text/main.swift, line 6
var someInt: Int = 1
if someInt >= 1 {
    assertionFailure("assertionFailure")
} else {
    assert(someInt == 0, "someInt != 0")
}

//__lldb_expr_14/MyPlayground.playground:3: Fatal error: assertionFailure

assert()함수를 간단히 사용해보면 다음과 같이 디버깅 가능하다.

func funcWithAssert(age:Int?) {  
    //age 가 nil이면 조건에 부합하지 않으므로 지나가지 않는다.
    assert(age != nil, "age == nil")
    assert((age! >= 0) && (age! <= 120), "나이값 입력이 잘못되었습니다.")
    
    print("당신의 나이는 \(age!)세 입니다.")
    
}
funcWithAssert(age: 2) //당신의 나이는 2세 입니다.
funcWithAssert(age: nil)
//__lldb_expr_16/MyPlayground.playground:5: Assertion failed: age == nil
funcWithAssert(age: 121)
//__lldb_expr_14/MyPlayground.playground:6: Assertion failed: 나이값 입력이 잘못되었습니다.

assertionFailure

정의

func assertionFailure(_:file:line:)(_ message: @autoclosure () -> 
String = String(), file: StaticString = #file, line: UInt = #line)

배포 버전 빌드에는 영향을 미치지 않지만, 디버그용 빌드에서 프로그램을 중단하고 디버그 가능한 상태로 전화하고 싶을 때 사용한다.

 

if 구문에 assertionFailure() 함수를 사용해 assert()의 조건이 실패한 것처럼 동작시킬 수 있다.

var someInt: Int = 1
if someInt >= 1 {
    assertionFailure("assertionFailure")
} else {
    assert(someInt == 0, "someInt != 0")
}

//__lldb_expr_14/MyPlayground.playground:3: Fatal error: assertionFailure

debugPrint

정의 1

func debugPrint(_:separator:terminator:)(_ items: Any, separator: String = " ", terminator: String = "\n")

items을 텍스트 표현으로 표준 출력하거나 output에 작성해 디버깅에 적합하도록 만든다. 

debugPrint("One two three four five")
// Prints "One two three four five"
 
debugPrint(1...5)
// Prints "ClosedRange(1...5)"
 
debugPrint(1.0, 2.0, 3.0, 4.0, 5.0)
// Prints "1.0 2.0 3.0 4.0 5.0"

공백이 아닌 다른 항목으로 구분된 항목을 출력하려면 separator의 값으로 원하는 값을 넣어주면 된다.

debugPrint(1.0, 2.0, 3.0, 4.0, 5.0, separator: " ... ")
// Prints "1.0 ... 2.0 ... 3.0 ... 4.0 ... 5.0"

출력할 때 자동 줄 바꿈을 원하지 않으면 terminator의 값으로 ""을 전달하면 된다.

for n in 1...5 {
    debugPrint(n, terminator: "")
}
// Prints "12345"

정의 2

func debugPrint(_:separator:terminator:to:)(_ items: Any, separator: String = " ", 
terminator: String = "\n", to output: inout Target)

함수 에 0개 이상의 항목을 debugPrint(_:separator:terminator:to:)를 사용하여 전달할 수 있다. 각 항목에 대한 텍스트 표현은 String(reflecting: item)를 호출하여 얻은 것과 동일하다.

var range = "My range: "
debugPrint(1...5, to: &range)
// range == "My range: ClosedRange(1...5)\n"

마찬가지로 공백이 아닌 다른 항목으로 구분된 항목을 출력하려면 separator의 값으로 원하는 값을 넣어주면 된다.

var separated = ""
debugPrint(1.0, 2.0, 3.0, 4.0, 5.0, separator: " ... ", to: &separated)
// separated == "1.0 ... 2.0 ... 3.0 ... 4.0 ... 5.0\n"

출력할 때 자동 줄 바꿈을 원하지 않으면 terminator의 값으로 ""을 전달하면 된다.

var numbers = ""
for n in 1...5 {
    debugPrint(n, terminator: "", to: &numbers)
}
// numbers == "12345"

dump

정의 1

//지정된 객체의 내용을 지정된 출력 스트림으로 덤프한다.
func dump(_:to:name:indent:maxDepth:maxItems:)(_ value: T, to target: inout TargetStream, 
name: String? = nil, indent: Int = 0, maxDepth: Int = .max, maxItems: Int = .max) -> T

정의 2

//주어진 객체의 내용을 표준 출력으로 덤프한다.
func dump(_:name:indent:maxDepth:maxItems:)(_ value: T, name: String? = nil, 
indent: Int = 0, maxDepth: Int = .max, maxItems: Int = .max) -> T

표준 출력 또는 지정된 출력 스트림을 통해 객체 내용의 덤프[각주:1]를 생성한다. 출력할 때 자동 줄 바꿈을 원하지 않는다면 terminator의 값으로 ""을 전달하면 된다.

 

print()dump() 함수 차이

  • print() - 디버깅 콘솔에 간략한 정보를 출력 / 출력하려는 인스턴스의 description 프로퍼티에 해당하는 내용을 출력
  • dump() - 함수보다 조금 더 자세한 정보를 출력 / 출력하려는 인스턴스의 자세한 내부 콘텐츠까지 출력

 

struct someInformations {
  let name: String
  var age: Int
}

var seogunInfo: someInformations = someInformations(name: "서근", age: 99)

print(seogunInfo) //someInformations(name: "서근", age: 99)

dump(seogunInfo)
/*
someInformations
  - name: "서근"
  - age: 99
*/
class Person {
  var height: Float = 0.0
  var weight: Float = 0.0
}

let seogun: Person = Person()
seogun.height = 200.2
seogun.weight = 60.6

print(seogun) //Person
dump(seogun)
/*
 Person
 - height: 200.2
 - weight: 60.6
 */

FatalError

정의

func fatalError(_:file:line:)(_ message: @autoclosure () -> String = String(), 
file: StaticString = #file, line: UInt = #line) -> Never

message의 내용을 출력하고 무조건 프로그램 실행을 중단시킨다. (프로세스를 죽임)

 

FatalError함수는 Never을 반환한다. 호출이 되면 더 이상 앱이 진행되지 않는다는 의미이다. 즉, 개발자가 인지 하지 못하는 상황에서 예외처리를 이 함수로 한다면, 실행되었을 때 문제가 있는 부분을 알 수 있다.

 

보통 에러가 치명적이거나, 메서드에서 리턴할것이 없을 때 사용한다.

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TableViewCell else {
        fatalError("The dequeued cell is not an instance of TableViewCell.")
    }
    return cell
}

 

 

읽어주셔서 감사합니다.

 

 

 

  1. 덤프란 컴퓨터 주기억장치나 레지스터, 데이터, 프로그램의 전체 또는 일부 자료에 기억시킨 내용을 보조기억장치 등 기록 매체에 복사 또는 전이하는 조작을 말한다. 즉, 기억장치의 내용을 전부 또는 일부를 인쇄하여 출력하는 것이다. [본문으로]

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


서근


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