【问题标题】:Difference between UIButton! and UIButton? in swift IOSUIButton 的区别!和 UIButton?在迅速的 IOS
【发布时间】:2014-10-10 10:45:57
【问题描述】:

现在只有我开始使用 swift 语言。我已经按如下方式初始化按钮

@IBOutlet weak var systemTextButton: UIButton!

之后我可以使用.setTitle() 属性设置标题。

如果我使用 ?代替 !初始化然后将.setTitle()上的错误显示为

UIButton? does not have a member named 'setTitle'

所以,请任何人告诉我 UIButton 之间的区别!和 UIButton? .

【问题讨论】:

    标签: ios swift uibutton


    【解决方案1】:

    它们都是可选类型。但是UIButton! 隐式地展开可选类型。您不必手动打开它。请注意,如果您尝试访问 UIButton! 而其 nil 的值,您的应用会崩溃。

    有关更多信息,请阅读 Apple 的“The Swift Programming Language”一书中的“Implicitly Unwrapped Optionals”部分。

    【讨论】:

      【解决方案2】:

      该按钮是可选的,因为它不是从一开始就确定该按钮是否会在界面构建器文档中找到。所以要么

      • 您确定它会在那里,在这种情况下,您可以在声明中解开它,
      • 或者它真的是一个可选的 - 那么你必须在每次你想使用它时打开它。

      也许界面构建器中按钮的存在在某种程度上是动态的,那么您可以将其保留为可选 (UIButton?) 以允许nil。在这种情况下,您必须在使用它之前检查它是否存在,或者使用myButton! 解开它。您这样做需要您自担风险,因为如果您在 nil 值上尝试它,您的程序将会崩溃。

      【讨论】:

        【解决方案3】:

        两种变体都在处理可选项(可能为 nil 的变量)。

        @IBOutlet weak var systemTextButton: UIButton!
        

        这是一个隐式展开的可选选项。感叹号表示您(程序员)在使用时绝对确定该变量不为零。您通过

        设置标题
        systemTextButton.setTitle(...)
        

        如果此时 systemTextButton 为 nil,则应用程序崩溃。

        问号说明这个变量可能为nil,所以你必须使用:

        systemTextButton?.setTitle(...)
        

        现在,setTitle() 仅在 systemTextButton 不为零时才会执行。

        希望对您有所帮助。

        有关选项的更多参考,请参阅The Swift Programming Language

        【讨论】:

          【解决方案4】:

          在这两个示例中,UIButton 被声明为可选。 不同的是,当你将它声明为 UIButton!它会自动为您解包,您不必检查它是否为 nil,您应该确保按钮不会为 nil。

          另外声明UIButton?不会为您解开此可选选项,当您想要访问它(或访问它的属性)时,您必须手动进行。 你可以通过两种方式做到这一点。如果您确定对象不为零,则可以使用:

          button!.setTitle()
          

          但是如果你不确定这个可选的状态,使用这个:

          if let btn = button {
               btn.setTitle()
          }
          else {
              // button is nil
          }
          

          【讨论】:

          • 如果它是可选的,if let 模式不是必需的:if button != nil 就足够了。
          【解决方案5】:

          当您声明类型为 UIButton? 的变量时,您是在对编译器说该变量可以为 nil(在 Objective-C 世界中为 NULL)。因此,它变成了“可选”,如果它为 nil,则该对象的所有后续操作都将被跳过。

          例如:

          class MyClass {
              var property: String?
          }
          
          let myInstance = MyClass()
          if let testVar = myInstance.property {
              println("Hello world")
          } else {
              println("Property unset")
          }
          

          您可以在官方 swift 文档中找到更多信息:

          https://developer.apple.com/librarY/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html

          【讨论】:

            【解决方案6】:

            这些类型的可选项被定义为隐式展开的可选项。通过在要设为可选的类型之后放置感叹号(字符串!)而不是问号(字符串?)来编写隐式展开的可选。

                let possibleString: String? = "An optional string."
                let forcedString: String = possibleString! // requires an exclamation mark
            
                let assumedString: String! = "An implicitly unwrapped optional string."
                let implicitString: String = assumedString // no need for an exclamation mark
            

            直接来自Apple Developer Library

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-02-08
              • 1970-01-01
              • 2016-12-09
              • 2016-07-14
              • 2016-11-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多