ローカルスコープについて、私の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
}
あなたの 'participant'変数の名前を変更しても、動作に違いはありません。それらはすべてすでに異なる変数です。 – rmaddy
無関係なニックピック - なぜあなたの '参加者 'クラス名は複数ですか?各インスタンスは1人の参加者を表します。クラスの名前は「参加者」にする必要があります。 – rmaddy
@rmaddyどのように私はスコープが働いたと思いますか。クラスはParticipantsという名前のDynamoDBテーブルにマップされます。 – kometen