class UserInfo {
var id: String?
var password: String?
var name: String?
}
A viewcontroller —> Userinfo(id: “Miro”, password: nil, name : nil)
B viewcontroller —> Userinfo(id: nil, password: “123”, name : nil)
C viewcontroller —> Userinfo(id: nil, password: nil, name : “Kim”)
→ 위와 같이 각각의 Instance가 생성이된다. 이럴 경우, 불필요하게 instance가 생성이되기에 Sington을 사용하여 하나의 Instance를 만들어서 처리하는 게 훨씬 더 효율적이다.
class UserInfo {
static let shared = UserInfo()
var id: String?
var password: String?
var name: String?
}
→ 혹시라도 init 함수를 호출해 Instance를 또 생성하는 것을 막기위해서!
class UserInfo {
static let shared = UserInfo()
var id: String?
var password: String?
var name: String?
private init() { }
}
//A ViewController
let userInfo = UserInfo.shared
userInfo.id = "Sodeul"
//B ViewController
let userInfo = UserInfo.shared
userInfo.password = "123"
//C ViewController
let userInfo = UserInfo.shared
userInfo.name = "Sodeul"
우리가 자주 사용하는 instance method는 instance가 생성이되지않으면 사용이 불가하지만, static같이 타입 프로퍼티에 사용 가능한 것은, instance가 없어도 사용이 가능하다.
→ 단, class는 overriding이 가능하지만, static은 불가능하다.
아래와 같이 사용이 가능하다!(인스턴스가 없는데도 불구하고!) → 이걸 가능하게 하는 게 static이다!
class A {
static func isStatic(){
print("this is static function")
}
class func isClass() {
print("this is class function")
}
A.isStatic() // "this is static function"
A.isClass() // "this is class function"
🌱 특정 타입에 속한 프로퍼티로 그 타입에 해당하는 단 하나의 프로퍼티만 생성됩니다. 이 타입 프로퍼티는 특정 타입의 모든 인스턴스에 공통으로 사용 되는 값을 정의할 때 유용하다.(인스턴스 생성 여부와 상관없이 값은 하나) 또한 저장 타입 프로퍼티는 타입자체에 초기자(initializer)가 없기 때문에 항상 ‘초기값’을 지정해서 사용해야 합니다.
struct Apple {
static var storedTypeProperty = "AAAAA"
static var computedTypeProperty: Int {
return 11111
}
}
print(Apple.storedTypeProperty) // AAAAA