2016-08-25 6 views
0

ローカルスコープについて、私のiOSアプリケーションで少し矛盾した動作が検出されました。swiftのif-elseステートメントのローカルスコープ2.3

座席が残っている場合、イベントに登録することができます。この場合、OnWaitingListおよびOnWaitingListAtではなく、と定義されています。

座席が残っていない場合、待機中のリストに乗ることができます。ユーザーが受け入れる場合(OKをクリック)、OnWaitingListはtrueに設定され、OnWaitingListAtはunixtimeに設定されます。どちらの場合も、同じDynamoDBテーブルに保存されます。

人は、複数のイベントに自身を登録することができます。私が見つけた何

は人 最初が待機リストに乗ったときだった(左なし席)と その後、別のイベント(左席)OnWaitingListがfalseでOnWaitingListAtは0で、初期値での登録自体クラス定義。これらの2つの値も同様に保存されます。

participant変数は、ifおよびelse文で角括弧{}の中に定義されています。

私はスコープが角括弧に束縛されていると仮定し、thisの記事に記載されているように同じ名前と異なる値を持つ2つの変数を持つことができました。私は間違っているかもしれませんが、このような状況下ではこのような相互交配は起こらないようです。

名前が異なる2つの変数がこの問題を解決します。それは流れを壊すことはありませんが、なぜこれが起こるかわからないので、迷惑です。

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

無関係なニックピック - なぜあなたの '参加者 'クラス名は複数ですか?各インスタンスは1人の参加者を表します。クラスの名前は「参加者」にする必要があります。 – 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 
} 

それは述べて:

iOS用AWSモバイルSDKが動作オプションのセーブ以下をサポートしています。

AWSDynamoDBObjectMapperSaveBehaviorUpdate:保存操作でモデル化されていない属性に影響を与えることはありません;モデル化された属性にnil値を渡すと、それがDynamoDBの対応する項目から削除されます。既定では、オブジェクトマッパーはこの動作を使用します。

これらの値を設定するのは、解決策よりも回避策です。

関連する問題