티스토리 뷰

Thrown Error


Swift에서 에러를 다루는 방법입니다.

스위프트의 함수에서는 에러를 전달할 수 있습니다. 에러를 전달하는 경우 throws 키워드를 적어줘야합니다.

func save() throws

 

do-catch문을 사용하여 던져진 에러값을 받을 수 있습니다.

throws 키워드가 존재하는 함수 호출시 try 키워드를 붇여줘야합니다.

do {
      try context.save()
  } catch let error {
      // error will be something that implements the Error protocol, e.g., NSError
      // usually these are enums that have associated values to get error details
      throw error // this would re-throw the error (only ok if the method we are in throws)
}

 

try 키워드 사용시 ?와 !를 붙여줄수 있습니다.

try! 사용시 에러가 throw된다면 크래시가 발생하게 됩니다.

try! context.save() // will crash your program if save() actually throws an error

try? 사용시 에러가 발생시 리턴값은 nil로 반환됩니다.

함수 정의시 리턴값이 Int로 적어도 Int? 타입으로 반환받게 됩니다.

let x = try? errorProneFunctionThatReturnsAnInt() // x will be Int?

 

Any & AnyObject


any와 anyObject는 특수한 타입입니다. 통상적으로 Objective-C 언어와 호환을 위해 사용됩니다.(Objective-C의 id 타입과 비슷)

anyObject는 클래스 한정해서 사용할 수 있는 any 타입입니다.

Any는 타입이 무엇인지 알 수 없습니다. 아무 타입이든 될 수 있기 때문입니다.

 

Any 타입을 사용되는 곳을 알아 봅시다.

이전에 본 내용 중 NSAttributedString이 있습니다.

let attributes: [NSAttributedStringKey:Any] = ...

딕셔너리의 Value값을 Any로 사용했었습니다.

 

UIViewContrller의 prepare 함수에서 확인이 가능합니다.

다른 MVC 화면 전환시 호출되는 함수로 어떤 객체에 의해 전환됐는지 sender 변수를 통해 알 수 있습니다.

func prepare(for segue: UIStoryboardSegue, sender: Any?)

UIButton이나 UITableViewCell등 여러 타입이 될 수 있기 때문에 Any타입으로 전달 됩니다.

 

수업시간에는 iOS API 사용 외에는 Any 타입 사용을 하지 말라고 합니다.

Swift는 강타입으로 사용해야합니다.(Swift로 작성시 Any를 사용해서는 안됩니다.)

 

전달 받은 Any 타입을 어떻게 사용 가능할까요?

반드시 내가 아는 타입으로 변환한 뒤 사용해야합니다. 그렇지 않으면 변수나 함수를 사용할 수 없기 때문입니다.

as? 키워드를 통해 타입 변환을 합니다. 성공시 명시한 타입으로 변환하고 실패시 nil을 반환합니다.

단순 변환 가능 확인은 is 키워드를 통해 알 수 있습니다.

코드를 통해 알아봅시다.

let unknown: Any = ... // we can’t send unknown a message because it’s “typeless” 
if let foo = unknown as? MyType {
	// foo is of type MyType in here
	// so we can invoke MyType methods or access MyType vars in foo // if unknown was not of type MyType, then we’ll never get here
}

만약 unknown 변수가 MyType이라면 if 조건문이 참이 되고 괄호 내부에서 foo(: MyType)라는 변수로 사용이 가능합니다.

실패시 nil을 반환하므로 괄호 내부는 실행되지 않습니다.

 

as? 키워드는 Any 아닌 다른 타입으로도 사용이 가능합니다.

let vc: UIViewController = ConcentrationViewController()
if let cvc = vc as? ConcentrationViewController {
	cvc.flipCard(...) // this is okay 
}

vc 변수는 UIViewController 타입이기 때문에 flipCard 함수를 알 수 없습니다.

flipCard 함수가 존재하는 ConcentrationViewController로 변환 후에 사용이 가능합니다.

 

알아둬야 할 클래스


NSObject

Objective-C 클래스의 루트 클래스입니다.

모든 Objective-C에서 클래스들은 NSObject를 상속해야하며 그러지 않을시 런타임 에러가 발생합니다.

UIViewController, UIKit의 클래스들은 Objective-C에서 만들어졌으며 NSObject가 루트 클래스 입니다.

몇몇 API에서 NSObject를 요구하는 곳이 있습니다.

 

NSNumber

Objective-C에서 숫자를 전달할 때 해당 클래스를 사용합니다.( 참조를 위한 클래스 타입입니다.)

Swift에서는 Int나 Double 클래스는 없습니다. 객체지향적으로 전달하기 위해서 NSNumber를 사용해야합니다.

NSNumber는 정수, 실수형, 논리값들 모두 표현이 가능합니다.

iOS의 많은 API가 NSNumber를 취하며 자동적으로 Swift의 타입으로 연결됩니다.

let n = NSNumber(35.5) or let n: NSNumber = 35.5
let intified: Int = n.intValue // also doubleValue, boolValue, etc.

 

Date

날짜와 시간을 표현하는 타입입니다.

내부적으로 1970년대 이후로 몇초가 지났는지 표현됩니다.

주로 Calendar, DateFormatter(문자열로 표시), DateComponents(년월일 확인) 클래스와 함께 사용됩니다.

언어마다 날짜 표현 체계가 다르기 때문에 위 클래스를 통하여 가공 후 사용됩니다.

 

Data

비트 정보를 가지는 타입입니다.

iOS API간에 데이터를 전달하기 위해 사용됩니다.

특정 URL에서 이미지를 다운받을때 보관하거나 UIImage를 만들때 전달하여 객체를 만들기도 합니다.

또는 데이터를 통해 JSON 형태로 변환시에도 사용됩니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함