Swift에서 속성이 외부 적으로는 읽기 전용이지만 속성을 소유 한 클래스 (및 하위 클래스)가 내부적으로 수정할 수있는 공통 패턴을 정의하는 일반적인 방법은 무엇입니까?
Objective-C에는 다음과 같은 옵션이 있습니다.
- 인터페이스에서 속성을 읽기 전용으로 선언하고 클래스 확장을 사용하여 속성에 내부적으로 액세스합니다. 이것은 메시지 기반 액세스이므로 KVO, 원 자성 등에서 잘 작동합니다.
- 인터페이스에서 속성을 읽기 전용으로 선언하지만 내부적으로 백업 ivar에 액세스합니다. ivar에 대한 기본 액세스가 보호되므로 하위 클래스도 값을 수정할 수 있지만 필드는 읽기 전용 인 클래스 계층 구조에서 잘 작동합니다.
Java에서 규칙은 다음과 같습니다.
- 보호 된 필드를 선언하고 공용 읽기 전용 getter (메소드)를 구현합니다.
Swift의 관용구는 무엇입니까?
답변
클래스 속성이 주어지면 속성 선언 앞에 액세스 수정 자 뒤에 괄호 가 get
오거나 set
괄호 사이에 추가 되어 다른 액세스 수준을 지정할 수 있습니다 . 예를 들어, public getter와 private setter가있는 클래스 속성은 다음과 같이 선언됩니다.
private(set) public var readonlyProperty: Int
추천 자료 : 게터와 세터
접근성 수준에 대한 Martin의 고려 사항은 여전히 유효합니다. 즉 protected
, 수정자가 없고 internal
모듈에 대한 액세스 만 제한 private
하고 현재 파일에만 제한없이 액세스를 public
제한합니다.
Swift 3 노트
이 새로운 액세스 수식 자, fileprivate
하고 open
있는 동안, 언어에 추가되었습니다 private
와 public
약간 수정되었습니다 :
-
open
클래스 및 클래스 멤버에만 적용됩니다. 클래스가 하위 클래스로 지정되거나 멤버가 정의 된 모듈 외부에서 재정의되도록 허용하는 데 사용됩니다.public
대신 클래스 또는 멤버를 공개적으로 액세스 할 수 있지만 상속하거나 재정의 할 수는 없습니다. -
private
이제fileprivate
포함 된 전체 파일에서 멤버를 표시하고 둘러싸는 선언에서만 액세스 할 수 있습니다.
답변
@Antonio에 따라 단일 속성을 사용하여 readOnly
속성 값으로 공개 및 readWrite
비공개 로 액세스 할 수 있습니다 . 아래는 내 그림입니다.
class MyClass {
private(set) public var publicReadOnly: Int = 10
//as below, we can modify the value within same class which is private access
func increment() {
publicReadOnly += 1
}
func decrement() {
publicReadOnly -= 1
}
}
let object = MyClass()
print("Initial valule: \(object.publicReadOnly)")
//For below line we get the compile error saying : "Left side of mutating operator isn't mutable: 'publicReadOnly' setter is inaccessible"
//object.publicReadOnly += 1
object.increment()
print("After increment method call: \(object.publicReadOnly)")
object.decrement()
print("After decrement method call: \(object.publicReadOnly)")
다음은 출력입니다.
Initial valule: 10
After increment method call: 11
After decrement method call: 10