2016-08-25 1 views
0

로컬 스코프에 대한 나의 ios 앱에서 약간의 일관성없는 동작을 발견했습니다.swift에서 if-else 명령문의 로컬 범위 2.3

좌석이 남아있을 때 사람이 이벤트에 등록 할 수 있습니다. 이 경우 OnWaitingListOnWaitingListAt이 아니며이 정의됩니다.

좌석이 없으면 대기자 명단에 올 수 있습니다. 사용자가 동의하면 (OK를 클릭) OnWaitingList가 true로 설정되고 OnWaitingListAt가 unixtime으로 설정됩니다. 두 경우 모두 동일한 DynamoDB 테이블에 저장됩니다.

사람이 여러 이벤트에 자신을 등록 할 수 있습니다. 내가 발견 무엇

사람 은 대기자 명단에 오면했다 (왼쪽 없음 석)과 후 다른 이벤트 (왼쪽 석) OnWaitingList이 거짓과 OnWaitingListAt이 0 초기 값에 자동적으로 등록 클래스 정의. 이 두 값은 저장됩니다.

participant 변수는 if 및 else 문의 대괄호 {} 안에 정의되어 있습니다.

범위를 대괄호로 묶었다고 가정하고 this 조항에 설명 된 것과 같이 동일한 이름과 가능한 다른 값을 갖는 두 개의 변수를 가질 수 있습니다. 나는 틀릴 수도 있지만,이 상황에서이 교차 수분이 일어나서는 안된다.

이름이 다른 두 개의 변수가이 문제를 해결합니다. 그것은 흐름을 어지럽히 지 않지만 왜 이런 일이 일어나는지 알 수 없기 때문에 성가시다.

if (still seats left) { 
    let participant = self.createParticipant(self.items[indexPath.row]) 

    dynamoDBObjectMapper.save(participant).continueWithExecutor(AWSExecutor.mainThreadExecutor(), withBlock: { (task:AWSTask!) -> AnyObject! in 
     Register person 
     return nil 
    }) 
} else { // Offer people to sign up on a waiting list. 
    let alertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert) 
    let waitingListAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel, handler: { (action:UIAlertAction) -> Void in 
     let participant = self.createParticipant(self.items[indexPath.row]) 
     participant.OnWaitingList = true 
     participant.OnWaitingListAt = NSDate().timeIntervalSince1970 

     dynamoDBObjectMapper.save(participant).continueWithExecutor(AWSExecutor.mainThreadExecutor(), withBlock: { (task:AWSTask!) -> AnyObject! in 
      Register person with OnWaitingList and OnWaitingListAt set 
      return nil 
     }) 
    }) 
} 

func createParticipant(item: AggregatedEvents) -> Participants { 
    let participant = Participants() 
    participant?.Timestamp = String(item.timestamp!) 
    participant?.Id = self.fbId 
    participant?.Date = item.date! 
    participant?.Event = item.event! 
    participant?.Location = item.location! 
    participant?.Name = self.name 
    participant?.Time = item.time! 

    return participant! 
} 

class Participants: AWSDynamoDBObjectModel, AWSDynamoDBModeling { 
    var Timestamp: NSString? // Partition key. 
    var Id: NSString?   // Sort key. 

    var Date: NSString? = "28. okt. 1967" 
    var Event: NSString? = "PT-AMOK Trening" 
    var Location: NSString? = "Breim" 
    var Name: NSString? = "Claus Guttesen" 
    var Time: NSString? = "19:00" 
    var OnWaitingList: NSNumber? = false 
    var OnWaitingListAt: NSNumber? = 0.0 
} 
+0

'participant' 변수의 이름을 바꾸면 아무런 차이가 없습니다. 그것들은 모두 이미 다른 변수들이다. – rmaddy

+0

관련 없음 nitpick - 왜 귀하의'참여자 '클래스 이름은 복수입니까? 각 인스턴스는 하나의 참여자를 나타냄니다. 클래스의 이름은 '참가자'여야합니다. – rmaddy

+0

@rmaddy 범위가 작동한다고 생각하는 방식은 다음 중 어느 것입니까? 이 클래스는 Participants라는 DynamoDB 테이블에 매핑됩니다. – kometen

답변

0

값이 저장되지 않도록하려면이 값을 nil로 설정하십시오. '다른 이름으로 저장 동작 옵션'이 미국에서 Amazons documentation에서

if (Still seats left) { 
    let participant = self.createParticipant(self.items[indexPath.row]) 
    participant.OnWaitingList = nil 
    participant.OnWaitingListAt = nil 
    Register and so on 
} 

는 :

가 AWSDynamoDBObjectMapperSaveBehaviorUpdate : 저장 작업에 모델링되지 않은 속성에는 영향을 미치지 않습니다

iOS 용 AWS 모바일 SDK는 행동 저장 옵션은 다음을 지원합니다 ; 모델링 된 속성에 nil 값을 전달하면 DynamoDB의 해당 항목에서 제거됩니다. 기본적으로 개체 매퍼는이 동작을 사용합니다.

이러한 값을 설정하는 것은 솔루션보다 해결 방법입니다.