swift 2.3

时间:2016-08-25 23:11:36

标签: ios swift if-statement scope

我刚刚在ios应用中发现了一个与本地范围有关的小不一致行为。

当有座位时,一个人可以注册参加活动。在这种情况下,OnWaitingListOnWaitingListAt 已定义。

如果没有座位,该人可以等候。如果用户接受(单击“确定”),则将OnWaitingList设置为true,将OnWaitingListAt设置为unixtime。在任何一种情况下都保存到同一个DynamoDB表中。

一个人可以注册多个活动。

我发现当一个人第一个进入等待名单(没有剩下的座位)而然后将自己注册到另一个事件(剩下的座位)OnWaitingList为false和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
}

1 个答案:

答案 0 :(得分:0)

为了防止存储这些值,我将它们设置为nil。

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

在“保存行为选项”的Amazons documentation中,它指出:

适用于iOS的AWS Mobile SDK支持以下保存行为选项:

AWSDynamoDBObjectMapperSaveBehaviorUpdate:不影响保存操作的未建模属性;传递建模属性的nil值将从DynamoDB中的相应项中删除它。默认情况下,Object Mapper使用此行为。

因此,设置这些值更多的是解决方案而不是解决方案。