【问题标题】:swift How to remove optional String Characterswift 如何删除可选的字符串字符
【发布时间】:2014-10-13 19:47:51
【问题描述】:

如何删除可选字符


let color = colorChoiceSegmentedControl.titleForSegmentAtIndex(colorChoiceSegmentedControl.selectedSegmentIndex)

println(color) // Optional("Red")

let imageURLString = "http://hahaha.com/ha.php?color=\(color)"
println(imageURLString)
//http://hahaha.com/ha.php?color=Optional("Red")

我只想输出“http://hahaha.com/ha.php?color=Red

我该怎么办?

嗯....

【问题讨论】:

    标签: string swift


    【解决方案1】:

    实际上,当您将任何变量定义为可选时,您需要解开该可选值。要解决此问题,您必须将变量声明为非选项或将!(感叹号)标记放在变量后面以解开选项值。

    var temp : String? // This is an optional.
    temp = "I am a programer"                
    print(temp) // Optional("I am a programer")
    
    var temp1 : String! // This is not optional.
    temp1 = "I am a programer"
    print(temp1) // "I am a programer"
    

    【讨论】:

    • 我知道这是一篇旧帖子,但是我想我会澄清几点,所以如果现在有人遇到这个问题,他们将获得正确的信息。第一个 println 没有打印,下一行 var temp1: String!不需要!你只需要写 var temp1: String //这不是可选的。同样在 temp 示例中,您可以在没有 Optional() 的情况下打印 temp 的值,只需编写 print(temp!) // "I am a programer" 当然,如果 temp 的值为零,则使用 !会导致错误,所以最好使用 if let 或 guard 来保护你的代码免受 nil 的影响。
    • This is not optional 错,它是一个 IUO,一个“隐式展开的可选”。它的值在访问时会自动解包。如果为 nil,应用程序将崩溃。
    • @Moritz 请调查这个问题。这与崩溃无关,
    • 我知道这个问题是关于什么的,啊哈。我要告诉你的是,你说的是错误。你说“这不是可选的”的那一行,你错了,这个一个可选的,它是一个隐式展开的可选。
    【解决方案2】:

    我再次查看了这个,我正在简化我的答案。我认为这里的大多数答案都没有抓住重点。你通常想打印你的变量是否有一个值,如果没有,你也希望你的程序不会崩溃(所以不要使用!)。这里就这样做

        print("color: \(color ?? "")")
    

    这会给你空白或值。

    【讨论】:

      【解决方案3】:

      swift3 你可以轻松删除可选的

      if let value = optionalvariable{
       //in value you will get non optional value
      }
      

      【讨论】:

      • 我喜欢这个。即使涉及更多代码,但它是安全的,它是干净的,并且,如果可选项为 nil,您可以执行操作,而无需在其他地方检查它。
      • 哈哈我一直在使用它,但实际上并不知道它的作用。现在我特别需要它,但不知道如何搜索:D 非常感谢,没有@MaciejSwic,这就是它应该完成的方式
      【解决方案4】:

      在尝试通过字符串插值使用它之前,您需要解包可选。最安全的方法是通过optional binding

      if let color = colorChoiceSegmentedControl.titleForSegmentAtIndex(colorChoiceSegmentedControl.selectedSegmentIndex) {
          println(color) // "Red"
      
          let imageURLString = "http://hahaha.com/ha.php?color=\(color)"
          println(imageURLString) // http://hahaha.com/ha.php?color=Red
      }
      

      【讨论】:

      • @user1272854 我的答案中的代码应该可以满足您的要求。您的代码与您在问题中发布的代码有什么不同吗?
      【解决方案5】:

      检查 nil 并使用“!”展开:

      let color = colorChoiceSegmentedControl.titleForSegmentAtIndex(colorChoiceSegmentedControl.selectedSegmentIndex)
      
      println(color) // Optional("Red")
      
      if color != nil {
          println(color!) // "Red"
          let imageURLString = "http://hahaha.com/ha.php?color=\(color!)"
          println(imageURLString)
          //"http://hahaha.com/ha.php?color=Red"
      }
      

      【讨论】:

      • 这行得通,但强制展开选项是非常糟糕的做法。你抛弃了 Swift 给你的所有类型安全。使用if letguard 将可选绑定到常量变量。 (见迈克的回答)
      【解决方案6】:

      虽然我们可能有不同的上下文,但以下内容对我有用。

      我将变量的每个部分都用括号括起来,然后在右右括号外添加了一个感叹号。

      例如print(documentData["mileage"])改为:

      print((documentData["mileage"])!)
      

      【讨论】:

        【解决方案7】:

        试试这个,

        var check:String?="optional String"
        print(check!) //optional string. This will result in nil while unwrapping an optional value if value is not initialized or if initialized to nil.
        print(check) //Optional("optional string") //nil values are handled in this statement
        

        如果您确信变量中没有 nil,请先使用。 此外,您可以使用 if let 或 Guard let 语句来解包选项而不会崩溃。

         if let unwrapperStr = check
         {
            print(unwrapperStr) //optional String
         }
        

        警戒,

         guard let gUnwrap = check else
         {
            //handle failed unwrap case here
         }
         print(gUnwrap) //optional String
        

        【讨论】:

        • 情况并非如此。在第一个中,如果您使用 print(check!) 并且对象实际上是 nil,它将使您的应用程序崩溃。添加感叹号会解开字符串中的可选更改吗?到一个字符串。如果为 nil,则会失败并导致崩溃。
        • 人们需要停止滥用!操作员。选项存在是因为选项的想法是您希望允许变量可以为 nil 的可能性。就像@MatthewKnippen 说的那样,如果你强制解开一个 nil 的可选项,那么应用程序就会崩溃。如果您需要强制打开选项,那么您可能不应该从一开始就使用选项。至少你应该使用if letguard let else unwrap 来确保它不为零。
        【解决方案8】:

        简单地将? 转换为! 解决了我的问题:

        usernameLabel.text = "\(userInfo?.userName)"
        

        usernameLabel.text = "\(userInfo!.userName)"
        

        【讨论】:

          【解决方案9】:

          除了其他答案中提到的解决方案之外,如果您想始终避免整个项目的可选文本,您可以添加此 pod:

          pod 'NoOptionalInterpolation'
          

          (https://github.com/T-Pham/NoOptionalInterpolation)

          pod 添加了一个扩展来覆盖字符串插值 init 方法,从而一劳永逸地摆脱 Optional 文本。它还提供了一个自定义运算符 * 来恢复默认行为。

          所以:

          import NoOptionalInterpolation
          let a: String? = "string"
          "\(a)"  // string
          "\(a*)" // Optional("string")
          

          更多详情请查看此答案https://stackoverflow.com/a/37481627/6390582

          【讨论】:

            【解决方案10】:

            print("imageURLString = " + imageURLString!)

            只需使用!

            【讨论】:

              【解决方案11】:

              您只需输入! 即可:

              print(var1) // optional("something")
              
              print(var1!) // "something"
              

              【讨论】:

                【解决方案12】:

                你好,我遇到了同样的问题,我得到了 Optional(3) 所以,我已经尝试了下面的代码

                cell.lbl_Quantity.text = "(data?.quantity!)" //"可选(3)"

                让数量 = 数据?.数量

                cell.lbl_Quantity.text = "(数量!)" //"3"

                【讨论】:

                • 欢迎来到 StackOverflow 并感谢您的贡献!请确保您的答案清楚地说明了问题的解决方案,并解释为什么它会帮助问题的原始发布者。只是链接或代码而没有太多解释的答案不是很有帮助,而且经常被删除。
                【解决方案13】:
                import UIKit
                
                let characters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
                
                var a: String = characters.randomElement()!
                var b: String = characters.randomElement()!
                var c: String = characters.randomElement()!
                var d: String = characters.randomElement()!
                var e: String = characters.randomElement()!
                var f: String = characters.randomElement()!
                var password = ("\(a)" + "\(b)" + "\(c)" + "\(d)" + "\(e)" + "\(f)")
                
                    print ( password)
                

                【讨论】:

                • 仅代码答案不是很有帮助。请添加有关此代码如何解决问题的说明
                • 问题太宽泛,不够具体。我正在介绍如何删除打印可选的案例。我将变量声明为字符串并通过在末尾添加感叹号来展开。
                • 当然,答案很长。我认为 Rajesh mourya 给出的答案是明确而简单的
                【解决方案14】:

                当您将任何变量定义为可选时,您需要解开该可选 value.Convert 吗?到!

                【讨论】:

                  猜你喜欢
                  • 2018-04-26
                  • 1970-01-01
                  • 2015-10-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-03-28
                  • 1970-01-01
                  • 2017-09-09
                  • 2013-04-17
                  相关资源
                  最近更新 更多