2016-08-25 37 views
0

我剛剛在我的ios應用程序中發現了一個小的不一致的行爲,關於本地範圍。swift中的if-else語句中的本地範圍2.3

當有剩餘座位時,一個人可以註冊一個活動。在這種情況下,OnWaitingListOnWaitingListAt而不是定義。

當沒有座位時,該人可以進入等候名單。如果用戶接受(單擊確定),則將OnWaitingList設置爲true,並將OnWaitingListAt設置爲unixtime。無論是哪種情況,都保存到同一個DynamoDB表中。

一個人可以註冊自己到多個事件。

我發現了什麼是一個人的時候第一在等候名單上得到(左沒有座位)和然後自身註冊到另一個事件(左座)OnWaitingList是假的,OnWaitingListAt爲0,在初始值類定義。這兩個值也會保存。

A 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

重命名任何'參與者'變量對任何行爲都沒有影響。他們都是不同的變數。 – rmaddy

+0

無關nitpick - 爲什麼你的'參與者'類名稱複數?每個實例代表一個參與者。該班級應該被命名爲「參與者」。 – rmaddy

+0

@rmaddy這是我認爲範圍工作的方式。該類映射到名爲參與者的DynamoDB表。 – kometen

回答

0

爲了防止值被存儲,我將它們設置爲零。

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

在「保存行爲選項」它指出Amazons documentation

的AWS移動SDK適用於iOS支持以下保存行爲選項:

AWSDynamoDBObjectMapperSaveBehaviorUpdate:不影響對保存操作未建模屬性;爲模型化屬性傳遞零值將從DynamoDB中的相應項中移除它。默認情況下,對象映射器使用此行爲。

因此,設置這些值更多的是解決方法。