ios개발

Swift - Access Control, 스위프트 제한자(open, public, internal, fileprivate, private)

studying develop 2021. 7. 24. 00:22

swift

 

open, public - 프로젝트안의 모든 모듈간에 사용이 가능하다. 즉 import로 불러온 모듈의 open으로 변수도 접근이 가능하다. 그래서 보통 모듈의 api 인터페이스들을 선언할때 주로 사용한다. 

 

아래 코드의 예를 들면 import alamofire로 불러와서 alamofire의 upload 함수가 open으로 선언된 함수이다.

  Alamofire.upload(multipartFormData: { multipartFormData in
    multipartFormData.append(imageData,
                             withName: "imagefile",
                             fileName: "image.jpg",
                             mimeType: "image/jpeg")
  },
                   to: "http://api.imagga.com/v1/content",
                   headers: ["Authorization": "Basic xxx"],
                   encodingCompletion: { encodingResult in
  })

 

internal - 인터널은 내 모듈안에서만 사용하도록 변수를 선언하는 것이다. 일반적으로 우리가 xcode에서 프로젝트를 만들어서 선언하는 변수들은 우리의 프로젝트 내에서만 사용하는 목적으로 변수를 사용한다. 

 

모듈 밖으로 이용된다는 것은 위의 alamofire 예에서 처럼 우리가 다른 사람들이 사용할 수 있는 모듈을 생성하는것이다.

 

fileprivate - 변수가 선언된 파일내에서만 변수에 접근할 수 있는 것이다.

 

private - 프라이빗은 변수가 선언된 enclosing declaration(선언 괄호 범위) 안에서만 사용할 수 있게 한다. 서로 같은 파일에서는 모두 접근해서 사용할 수 있게하는 fileprivate과는 달리 private으로 선언하면 같은 파일 내에 있어도 다른 개체라면 서로 접근 할 수가 없다.

 

즉 private은 정의 밖에서는 접근을 하지 못한다.

 

import Foundation

class Car {
    private let instance = Car()
    private var wheel: String = "4 wheels"
}

class Bus {
    private let instance = Car()
    
    func someFunc() {
        print(instance.wheel) // Error다. private은 선언한 구문 안에서만 사용 가능해서
    }
}

//반면에 swift4 이상에서는 해당 선언의 extension안에서는 사용가능하다.
extension Car {
    func newFunc() {
        print(instance.wheel) // Ok.
    }
}

 

 

참고.

https://hcn1519.github.io/articles/2018-01/Swift_AccessControl

https://zeddios.tistory.com/383