【问题标题】:Swift handling nil [duplicate]Swift 处理 nil [重复]
【发布时间】:2020-08-08 16:49:27
【问题描述】:

我是 Swift 新手,这是给我一个错误的代码,即使它没有文本,它也会以某种方式超过 "lastName != nil"。

线程 1:致命错误:在展开可选值时意外发现 nil

func imageFromInitials(firstName: String?, lastName: String?, withBlock: @escaping (_ image: UIImage) -> Void) {

var string: String!
var size = 36

if firstName != nil && lastName != nil {
    string = String(firstName!.first!).uppercased() + String(lastName!.first!).uppercased()
} else {
    string = String(firstName!.first!).uppercased()
    size = 72
}

我很困惑,不确定为什么验证不起作用

【问题讨论】:

    标签: swift if-statement


    【解决方案1】:

    字符串为空与它为 nil 不同。您还需要检查字符串是否为空,或者只是安全地解开名字和姓氏的第一个字符:

    func imageFromInitials(firstName: String?,
                           lastName: String?,
                           withBlock block: @escaping (_ image: UIImage) -> Void) {
        let string: String
        let size: Int
    
        if let firstInitial = firstName?.first {
            if let lastInitial = lastName?.first {
                string = (String(firstInitial) + String(lastInitial)).uppercased()
                size = 36
            } else {
                string = String(firstInitial).uppercased()
                size = 72
            }
        } else {
            string = ""
            size = 36
        }
    
        // the rest of your function
    }
    

    或者,如果您想以更“Swifty™”的方式执行此操作(并且如果您可以在 的情况下生成非空 string > 提供了lastName,那么你可以这样做:

    func imageFromInitials(firstName: String?,
                           lastName: String?,
                           withBlock block: @escaping (_ image: UIImage) -> 
        let string = [firstName, lastName]
            .compactMap { $0?.first }
            .map { String($0) }
            .joined()
            .uppercased()
    
        let size = string.count == 1 ? 72 : 36
    
        // the rest of your function
    }
    

    【讨论】:

    • 您可以通过以 size 和零开头并添加 36(最多)两次来取消嵌套。
    【解决方案2】:

    正如错误所说:

    在展开可选值时意外发现 nil

    这意味着 firstName != nil && lastName != nil 不正确。你得到的错误在这里:

    string = String(firstName!.first!).uppercased()
    

    可能 firstName 也为零。

    您可以检查像 firstName .isEmpty 这样的字符串。它检查 nil 和 ""(空字符串)。

    【讨论】:

      【解决方案3】:

      您也可以使用这样的 switch 语句,这样您就可以更好地控制正在发生的事情:

      func imageFromInitials(firstName: String?, lastName: String?, withBlock: @escaping (_ image: UIImage) -> Void) {
      
      var string = ""
      var size = 36
      
          switch (firstName?.first, lastName?.first) {
      
          case (.some(let first), .some(let last)):
              string = first.uppercased() + last.uppercased()
          case (.some(let first), nil):
              string = first.uppercased()
              size = 72
          case (nil, .some(let last)):
              string = last.uppercased()
              size = 72
          default:
              print("Both are nil, something is wrong")
      
          }
          print(string)
          // your code
      }
      

      这篇文章有点老了,但它解释了为什么你可以在可选项上使用.some 大小写,因为它们是枚举。

      Swift: testing against optional value in switch case

      【讨论】:

        猜你喜欢
        • 2016-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多