[ios] NSUserDefaults-키가 있는지 확인하는 방법

작은 iPhone 앱을 만들고 있는데 NSUserDefaults데이터 지속성으로 사용 하고 있습니다. 이름과 숫자와 같은 몇 가지 사항 만 추적하면되므로 간단하게 유지할 수 있습니다.

이 페이지참조 하여 찾았 지만 내 질문에 대답 할 수는 없다고 생각합니다. 기본적으로 값 (또는 키)이 이미 존재하는지 확인한 NSUserDefaults다음 그에 따라 무언가를 수행 할 수 있기를 원합니다 .

몇 가지 예 : 앱이 시작됩니다. 앱이 처음 시작되면 시작을 알리는 경고를 출력합니다. 처음 열 었는지 UserDefaults확인 하려면를 읽고 확인하십시오.

예 2 : 이름이 입력 한 “Hello [Name]”입니다. 앱을 연 상태에서 이름이 없으면 “Hello World”라고 표시되어야합니다. 이미 이름을 입력했는지 확인하고 그에 따라 행동하십시오. 이름은에 저장됩니다 NSUserDefaults.

여기에 도움이 필요하십니까? 정말 고마워요!



답변

objectForKey:nil존재하지 않으면 반환 됩니다.


답변

위에서 언급했듯이 0 / NO가 유효한 값일 수있는 기본 유형에는 작동하지 않습니다. 이 코드를 사용하고 있습니다.

NSUserDefaults *defaults= [NSUserDefaults standardUserDefaults];
if([[[defaults dictionaryRepresentation] allKeys] containsObject:@"mykey"]){

    NSLog(@"mykey found");
}


답변

objectForKey:방법은 반환 nil값이 존재하지 않는 경우. 다음은 값이 0인지 여부를 알려주는 간단한 IF / THEN 테스트입니다.

if([[NSUserDefaults standardUserDefaults] objectForKey:@"YOUR_KEY"] != nil) {
    ...
}


답변

존재하지 않는 경우 objectForKey는 nil을 리턴합니다.존재하는 경우 nil도 리턴하며 값이 0 인 정수 또는 부울입니다 (예 : 부울의 경우 FALSE 또는 NO).

5.1 및 6.1 모두 시뮬레이터에서 이것을 테스트했습니다. 즉, “객체”를 요청하여 정수 또는 부울 값을 실제로 테스트 할 수 없습니다. “0으로 설정”된 것처럼 “설정되지 않음”을 처리하지 않으려면 정수를 사용하여이 문제를 해결할 수 있습니다.

이미 이것을 테스트 한 사람들은 잘못된 부정적 측면에 의해 바보 인 것처럼 보입니다. 즉, 키가 설정되지 않았다는 것을 알았을 때 objectForKey가 nil을 반환하는지, 키가 설정되어 있으면 nil을 반환한다는 것을 알지 못하는지 확인하여 테스트 설정되었지만 NO로 설정되었습니다.

내 자신의 문제로 나를 여기로 보냈기 때문에 원하는 부울의 의미를 변경하여 원하는 기본값이 NO로 설정된 값과 일치하도록했습니다. 옵션이 아닌 경우 부울 이외의 것으로 저장하고 YES, NO 및 “설정되지 않음”의 차이점을 알 수 있어야합니다.


답변

스위프트 3/4 :

다음은 UserDefaults를 통해 액세스되는 다른 유형의 선택적 리턴 동작을 모방 한 Int / Double / Float / Bool 키-값 유형의 간단한 확장입니다.

( 2018 년 8 월 30 일 편집 : Leo의 제안에서보다 효율적인 구문으로 업데이트되었습니다.)

extension UserDefaults {
    /// Convenience method to wrap the built-in .integer(forKey:) method in an optional returning nil if the key doesn't exist.
    func integerOptional(forKey: String) -> Int? {
        return self.object(forKey: forKey) as? Int
    }
    /// Convenience method to wrap the built-in .double(forKey:) method in an optional returning nil if the key doesn't exist.
    func doubleOptional(forKey: String) -> Double? {
        return self.object(forKey: forKey) as? Double
    }
    /// Convenience method to wrap the built-in .float(forKey:) method in an optional returning nil if the key doesn't exist.
    func floatOptional(forKey: String) -> Float? {
        return self.object(forKey: forKey) as? Float
    }
    /// Convenience method to wrap the built-in .bool(forKey:) method in an optional returning nil if the key doesn't exist.
    func boolOptional(forKey: String) -> Bool? {
        return self.object(forKey: forKey) as? Bool
    }
}

이제 다른 내장 get 메소드 (문자열, 데이터 등)와 함께 일관성이 향상되었습니다. 이전 메소드 대신 get 메소드를 사용하십시오.

let AppDefaults = UserDefaults.standard

// assuming the key "Test" does not exist...

// old:
print(AppDefaults.integer(forKey: "Test")) // == 0
// new:
print(AppDefaults.integerOptional(forKey: "Test")) // == nil


답변

방금이 과정을 거쳤 으며 귀하의 모든 답변이 저에게 좋은 해결책을 찾도록 도와주었습니다. 나는 읽고 이해하기가 어려워서 제안한 길을가는 것을 거부했다.

여기 내가 한 일이 있습니다. “_talkative”라는 변수에서 BOOL을 수행했습니다.

기본 (NSUserDefaults) 객체를 설정할 때 객체가 아닌지 확인하기 위해 객체 로 설정했습니다 .

//converting BOOL to an object so we can check on nil
[defaults setObject:@(_talkative) forKey:@"talkative"];

그런 다음 존재하는지 확인하려고 할 때 다음을 사용했습니다.

if ([defaults objectForKey:@"talkative"]!=nil )
  {

그런 다음 객체를 BOOL로 사용했습니다.

if ([defaults boolForKey:@"talkative"]) {
 ...

이것은 내 경우에는 효과가있는 것 같습니다. 그것은 나에게 더 시각적으로 의미가 있습니다.


답변

이 작은 나팔을보십시오 :

-(void)saveUserSettings{
NSNumber*   value;

value = [NSNumber numberWithFloat:self.sensativity];
[[NSUserDefaults standardUserDefaults] setObject:value forKey:@"sensativity"];
}
-(void)loadUserSettings{
    NSNumber*   value;
    value = [[NSUserDefaults standardUserDefaults] objectForKey:@"sensativity"];
    if(value == nil){
        self.sensativity = 4.0;
    }else{
        self.sensativity = [value floatValue];
    }
}

모든 것을 대상으로 취급하십시오. 나를 위해 일하는 것 같습니다.