objective-c 속성이 있습니다. 내가 필요한 것은 변수에 쓰기 전용 속성을 할당하는 것인데, 정확히 읽기 전용과 반대되는 것, 즉 변수에 setMethod
이있을 수 있지만 getMethod
이 없어야합니다. 나는 그것을하는 방법을 모른다. 일부 코드 스 니펫의 답변이 만족 스럽습니다.Objective-C에 속성 만 쓰기
답변
:
@interface MyClass {
@private
int _var;
}
- (void)setVar:(int)newVar;
@end
@implementation MyClass
- (void)setVar:(int)newVar {
_var = newVar;
}
@end
지금 당신은 쓰기 전용입니다 속성과 같은 변수 var
에 액세스 할 수 있습니다 : 당신이 가짜 속성을 읽으려고하면
@implementation SomeOtherClass
...
MyClass c = [[MyClass alloc] init];
c.var = 3;
...
@end
을 그리고를 컴파일러가 경고합니다.
재산이 필요한 이유가 있습니까? 세터를 메서드로 선언하고 일반 [foo setVar:bar]
구문을 사용합니다.
또는 도트 구문을 사용하십시오 ...'foo.var = bar; '는 여전히 작동합니다. – bbum
예, 작동하지만 입력 할 때 xCode가 자동 완성 var로 보이지 않습니다. –
@FredrikJohansson 당신 말이 맞아요. 자동 완성 친화적 인 솔루션을 원한다면 내 솔루션을 확인해보십시오. –
또 다른 유효한 접근 방법은 누군가가 게터 액세스를 시도 할 경우 컴파일 타임 오류가 발생합니다
@interface MyClass
@property NSString * var;
- (NSString *)var UNAVAILABLE_ATTRIBUTE;
@end
이 사용할 수 없게 게터를 일반 속성을 선언하는 것입니다.
이 방법의 가장 큰 장점은 당신이 실제로 부동산 TM하지 암시 인스턴스 변수와 세터에 의해 위조 대리를 가지고입니다 :
- 당신
- 과 같은 모든 런타임 기능이
class_getProperty
및class_copyPropertyList
과 같이 예상대로 작동 할 때 자동 완료됩니다.
는 경우
(비 id
재산의 경우) 게터 구현 어쨌든 합성하고
NSString * string = [myObj performSelector:@selector(var)];
또는 NSInvocation
를 사용하여 같은 것을 사용하여 호출 될 수 말했다 편집증 및 당신 정말 클라이언트가 getter를 호출하지 못하게하려는 경우, 자신의 구현을 제공하여 명시 적으로 예외를 throw 할 수 있습니다. 누군가가 심각하게 인스턴스 변수 함부로 변경하고자하는 경우 마지막주의가 유스 케이스 주어진 아마 쓸모가 있도록
@implementation MyClass
- (int)var {
[NSException raise:NSInternalInconsistencyException
format:@"property is write-only"];
}
@end
어쨌든, 그들은 그것을 액세스 할 수 런타임을 사용할 수 있습니다. 컴파일 타임 오류는 당신이 정말로 찾고있는 것이다.
쓰기 전용 속성은 무엇을 사용합니까? IMHO 그것은 단지 메모리 낭비입니다. – Eimantas
많이 사용합니다. 일반적으로 뭔가를 공개적으로 쓰기 전용으로하고 내부적으로 클래스에 쓰기를 원하면 읽기 전용입니다. – bbum
외부 클래스가 전달해야하는 변수를 알고 있지만 현재 설정되어있는 변수를 알 수있는 이유가 없습니다. – ArtOfWarfare