iOS Swift 1.2 - 原始类型比较失败

时间:2015-07-23 15:36:30

标签: ios xcode swift primitive-types

我有一个从Firebase获取和解析数据的函数。我有一个验证" parseUserModel)返回" Bool"如果模型符合要求,则键入。我将此值设置为bool类型的validUser。我拉的模型实际上是通过并返回一个true的布尔值。

问题发生在哪里。

If(validUser) { ... code ... } fails even though the validUser is "true".

我已经玩过实际的返回类型,我尝试过这些:

  1. validUser.boolValue并在if(validUser.boolValue)中设置
    • 此失败
  2. 设置if(validUser){... code ...}
    • 此失败
  3. 设置if(validUser == true){.. code ..}
    • 此失败
  4. 设置if(validUser.boolValue == true){code}
    • 此失败
  5. 我完全没有想到为什么这会失败。我将原始类型(我假设)与另一种原始类型进行比较。

    我的问题

    1. 是真实的' Swift中的关键字实际上不是Bool对象类型吗?
    2. 当我明确要求boolValue时,为什么会失败?
    3. 是他们应该知道的Swift错误吗?
    4. 是if语句没有做我认为应该做的事情吗?
    5. 检索数据功能

      public static func retrieveUserData(user:UserModel, completion:(success:Bool)->Void){
          if(user.username != nil){
              let fbRef = Firebase(url: GlobalVariables().FB_BASE_URL+"users/\(user.username)")
              fbRef.observeSingleEventOfType(FEventType.Value, withBlock: { (snapshot) -> Void in
                  if(snapshot.value != nil){
                      let validUser:Bool = UserModel.sharedInstance.parseUserData(JSON(snapshot.value))
                      println(validUser)
                      println(validUser.boolValue)
                      if(validUser.boolValue){
                          completion(success: true)
                      } else {
                          completion(success: false)
                      }
                  }
              })
          }
      }
      

      解析模型和验证

      public func parseUserData(data:JSON) -> Bool {
          var uName:String!
          var uFullName:String!
      
          if let username = data["username"].string {
              UserModel.sharedInstance.username = username
          }
      
          if let fullName = data["fullName"].string {
              UserModel.sharedInstance.fullName = fullName
          } else {
              return false
          }
      
          if let biography = data["biography"].string {
              UserModel.sharedInstance.biography = biography
          }
      
          if let email = data["email"].string {
              UserModel.sharedInstance.email = email
          }
      
          if let plistID = data["playlistCollectionID"].string {
              UserModel.sharedInstance.playlistCollectionID = plistID
          } else {
              //generate a playlistCollectionID because the user doesn't have one
              UserModel.sharedInstance.playlistCollectionID = NSUUID().UUIDString
          }
          if(UserModel.validateUserObject(UserModel.sharedInstance)) {
              return true
          } else {
              return false
          }
      }
      

      来自Xcode的Println()日志 真正 真

      以上两个都来自检索代码 println(validUser)和println(validUser.boolValue)

2 个答案:

答案 0 :(得分:2)

Swift中的Bool类型符合BooleanType,其成员为:

var boolValue: Bool { get }

存储在validUser中的值肯定是Bool,否则你将无法将它放在Bool类型的变量中。

此处最可能的情况是您的代码中存在错误。再次检查它并确保它实际上进入了else块而不是if块。

作为旁注,if语句的Swift格式约定如下所示:

if condition {
    ...
} else {
    ...
}

而不是if(condition){...

答案 1 :(得分:0)

由于我自己的愚蠢,我将共享用户实例UserModel发送到自身。

private static func validateUserObject(object:UserModel) -> Bool {
    println(object.username)
    println(object.fullName)
    if(object.username != nil && object.fullName != nil){
        return true
    } else {
        return false
    }
}

所以我会这样称呼这个方法......

UserModel.sharedInstance.validateUserObject(self)

这会导致Function specialization爆炸。这不会导致应用程序崩溃(这是一个奇怪的部分)。它会继续并返回真正的布尔值(因为模型是有效的)。