[스탠포드iOS] Swift 기초문법 정리(AnyObject, Plist, NSUserDefault)
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
}