iOS/스탠포드 iOS 강의

[스탠포드iOS] Swift 기초문법 정리(AnyObject, Plist, NSUserDefault)

홍루피 2024. 3. 17. 20:44

1. AnyObject

프로토콜. Objective-C와 호환을 위해 사용

Objective-C에서는 id라는 타입(모르는 클래스 객체에 대한 포인터) 존재

Swift에서도 위와 동일한 의미로 사용됨

 

AnyObject은 어떨때 사용?

1. prepareForSegue와 같이 인자의 타입이 적어도 두 개 이상 될 수 있을 때 사용

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject)
func touchDigit(sender: AnyObject)

 

2. 쿠키(cookie) 반환 시

쿠키는 상태를 저장하고 뭔가를 기억하고 있다가 돌려주는 값. 어떤 값인지 알 수 없다

var cookie: AnyObject

 

AnyObject은 어떻게 사용?

우리가 아는 타입으로 변환해서 사용해야 함

변환하려고 할 때 그 타입이 아닐수도 있기 때문에 변환이 불가능 할 수도 있다.

as : 다른타입으로 변환하는 것을 "시도"하는 표현. AnyObject를 어떤타입으로서 대한다.

let ao: AnyObject = ...
if let foo = ao as? SomeClass { }
@IBAction func touchDigit(sender: AnyObject){
	if let sendingButton = sender as? UIButton {
    	let digit = sendingButton.currentTitle!
    }else if let sendingSlider = sender as? UISlider {
    	let digit = String(Int(sendingSlider.value))
    }
}

 

2. Plist: Property List

AnyObject를 사용하는 또 다른 곳

Array, Dictionary, String, Double, NSData 등의 클래스로 데이터 구조를 만들면 Property List가 생김

Property List는 보이지 않게 전달됨. 안을 보는 사람은 Dictionary, Double 등이 있다는 것만 알고 데이터가 무엇을 의미하는지 알 수 없음

3. NSUserDefault

Property List를 받아서 디스크에 영구적으로 기억되도록 함

앱을 종료했다 다시켜서 봐도 그대로 있음. Property List의 데이터베이스

큰 데이터(예를 들어 영어사전...)에 사용하면 안됨. 설정 같은 작은 것에 사용

아래 함수들을 사용해 Property List를 저장하고 다시 가져올 수 있음 - 데이터의 의미는 알 수 없음

setObject(AnyObject, forKey: String)
objectForKey(String) -> AnyObject?
arrayForKey(String) -> Array<AnyObject>?

 

더 작은 단위로도 값을 저장할 수 있음

Double은 그 자체가 Property List

setDouble(Double, forKey: String)
doubleForKey(String) -> Double

 

UserDefault 사용방법

1. standardUserDefault의 공유되는 인스턴스를 생성

let defaults = NSUserDefaults.standardUserDefaults()

 

2. 특정 propertyList 가져오고 저장

let plist = defaults.objectForKey("foo")
defaults.setObject(plist, forkey: "foo")

 

데이터를 수정하게 되면 자동으로 저장이 되지만 강제로 디스크에 저장하고 싶으면 Bool값을 반환하는 동기화 필요

if !defaults.synchronize() { 실패하면 무엇을 해야하는지 모르기 때문에 반환 무시 }

 

Casting

let vc: UIViewController = CalculatorViewController()
vc.displayValue //불가
if let calcVC = vc as? CalculatorViewController {
	let x = calcVC.displayValue
}