Swift函数 - 传递可选对象

时间:2015-02-25 15:25:35

标签: ios function swift parameters

所以我试图在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

2 个答案:

答案 0 :(得分:1)

如果你在submitBoilerPlate函数中的某个地方使用它,那么问题不在于UIButton?,而在于_params:[String: String!]。尝试将其替换为_params:[String: String]

答案 1 :(得分:1)

将代码粘贴到游乐场是帮助自己调试的好方法。我把你的代码带到我自己的游乐场,发现以下工作:

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类型以及_params来电中_buttonsubmitBoilerPlate错误的删除。

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

_params_button作为函数调用的一部分实际上是一个错误。当没有空间时,参数没有名称。另一个例子是:

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

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