빠른 읽기 전용 외부, 읽기 쓰기 내부 속성
Swift에서 속성을 외부에서만 읽을 수 있지만 속성을 소유한 클래스(및 하위 클래스)에 의해 내부적으로 수정할 수 있는 공통 패턴을 정의하는 일반적인 방법은 무엇입니까?
목표-C에는 다음과 같은 옵션이 있습니다.
- 인터페이스에서 속성을 읽기 전용으로 선언하고 클래스 확장을 사용하여 내부적으로 속성에 액세스합니다.이것은 메시지 기반 액세스이므로 KVO, 원자성 등과 잘 작동합니다.
- 인터페이스에서 속성을 읽기 전용으로 선언하지만 내부적으로 백업 ivar에 액세스합니다.ivar에 대한 기본 액세스가 보호되므로 이는 클래스 계층에서 잘 작동하며, 하위 클래스에서도 값을 수정할 수 있지만 그렇지 않으면 필드가 읽기 전용입니다.
자바의 표기법은 다음과 같습니다.
- 보호된 필드를 선언하고 공용 읽기 전용 게터(메소드)를 구현합니다.
스위프트의 관용구는 무엇입니까?
클래스 속성이 주어지면 속성 선언 앞에 액세스 수식자를 붙여 다른 액세스 수준을 지정할 수 있습니다.get
또는set
괄호 안에예를 들어, 공용 getter와 개인 setter가 있는 클래스 속성은 다음과 같이 선언됩니다.
private(set) public var readonlyProperty: Int
권장 판독치: 게터와 세터
접근성 수준에 대한 Martin의 고려 사항은 여전히 유효합니다. 즉, 없습니다.protected
수식어,internal
모듈에 대한 액세스만 제한합니다.private
현재 파일에만 적용됩니다.public
무제한으로
스위프트 3 노트
2개의 새로운 액세스 수정자,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
언급URL : https://stackoverflow.com/questions/25708439/swift-readonly-external-readwrite-internal-property
'programing' 카테고리의 다른 글
JFrame에서 전체 mariadb 출력을 가져올 수 없습니다. (0) | 2023.08.09 |
---|---|
클래스에 주석을 달아 한정자가 있는 @MockBean을 생성하시겠습니까? (0) | 2023.08.09 |
PHP - 배열 내부에서 배열을 병합하는 방법 (0) | 2023.08.09 |
여러 진입점을 갖도록 Spring Security 3.x 구성 (0) | 2023.08.09 |
Android Studio에서 작성한 프로젝트에서 사용자 지정 글꼴을 사용하는 방법 (0) | 2023.08.09 |