Swift 函数 - 传递可选对象

Swift function - pass optional object

所以我试图在 Swift 中调用函数 "submitBoilerPlate":

var url:String = "https://eamorr.com/ajax/getLatestContent.php"
var params = [
   "hello":"world"
]
submitBoilerPlate(url, _params:params, _button:nil)

这里是对应的函数:

func submitBoilerPlate(_url:String, _params:[String: String!], _button:UIButton?){
    var oldTitle = _button?.titleLabel?.text

    _button?.setTitle("Please wait...", forState: UIControlState.Normal)
    _button?.enabled = false
    //etc.
    ...
}

当我发送一个在我的 xib 上声明的真实 UIButton 时,一切都按预期工作。

但是,我希望能够发送一个 "nil" 按钮(这个特定的 xib 没有按钮)。

这可能吗?还是我必须创建一个新功能?我试图将代码重复保持在最低限度...

当代码到达 submitBoilerPlate(...) 时,我收到以下 运行 时间错误:

fatal error: can't unsafeBitCast between types of different sizes

您的问题不在于 UIButton?,而是在于 _params:[String: String!],如果您在 submitBoilerPlate 函数下面的某处使用它的话。尝试将其替换为 _params:[String: String]

将您的代码粘贴到 playground 是帮助您进行调试的一个很好的方法。我把你的代码带到我自己的操场上,发现以下代码有效:

import UIKit

func submitBoilerPlate(_url:String, _params:[String: String!], _button:UIButton?){
    var oldTitle = _button?.titleLabel?.text

    _button?.setTitle("Please wait...", forState: UIControlState.Normal)
    _button?.enabled = false
}

var url:String = "https://eamorr.com/ajax/getLatestContent.php"
var params:[String: String!] = [
    "hello":"world"
]
submitBoilerPlate(url, params, nil)

请注意 params 的明确类型以及 submitBoilerPlate 调用中 _params_button 错误的删除。

在没有显式类型的情况下指定 params 会导致编译器无法根据所需的 [String: String!] 参数类型正确对齐您的位。

_params_button 作为函数调用的一部分实际上是一个错误。当没有 space 时,参数没有名称。备选方案的一个例子是:

func submitBoilerPlate(_url:String, someParams _params:[String: String!], andButton _button:UIButton?) {
  // .. same func body
}

submitBoilerPlate(url, someParams:params, andButton:nil)