二元运算符'+'不能应用于'String'和'() -> String'类型的操作数

Posted

技术标签:

【中文标题】二元运算符\'+\'不能应用于\'String\'和\'() -> String\'类型的操作数【英文标题】:Binary operator '+' cannot be applied to operands of type 'String' and '() -> String'二元运算符'+'不能应用于'String'和'() -> String'类型的操作数 【发布时间】:2018-07-08 01:51:04 【问题描述】:
class ViewController: UIViewController
    var token: String?

    func settoken(newtoken: String)
        token = newtoken
    

    func gettoken() -> String
        return token!
    

    func gotoverifyphone()
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let verifyphone = storyboard.instantiateViewController(withIdentifier: "verifyphone")
        OperationQueue.main.addOperation
            self.present(verifyphone, animated: true, completion: nil)
        
    

    @IBAction func btnPressed(_ sender: Any)
        ...some code
        let newtoken = json["message"] as? String
        self.settoken(newtoken: newtoken!)
        self.gotoverifyphone()
    

ViewController.swift

class VC_VerifyPhone: UIViewController 
    @IBAction func btnVerifyPressed(_ sender: Any)
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        let token = "Bearer " + ViewController.gettoken(ViewController)
// the line above shows Binary operator '+' cannot be applied to operands of type 'String' and '() -> String'
        request.addValue("authorization", forHTTPHeaderField: token)
    

VC_VerifyPhone.swift

在第2类的最后一行,显示错误:

二元运算符'+'不能应用于'String'和'() -> String'类型的操作数

我做错了什么,我该如何解决?

编辑:

现在我收到此错误:

实例成员“gettoken”不能用于类型“ViewController”;您的意思是改用这种类型的值吗?

【问题讨论】:

【参考方案1】:

您已经被 Swift 的一些乐趣/怪异/等等所困扰。取决于你的观点!

gettoken()ViewController 类的instance 方法,应该在实例上调用。例如:

var myViewController : ViewController = ...
...
let token = myViewController.gettoken()

您还没有这样做,而是在 class 本身上调用了它,这根本不是一回事。你需要一个 ViewController 类的 instance 来调用get token()

为什么会出现令人困惑的错误?

由于我不会试图解释 Swift 4 的原因(至少,Swift 是一个移动的目标)允许你写:

myViewController.gettoken()

作为

ViewController.gettoken(myViewController)()

这部分是你写的,错误信息是指这个表格。 (对于最终好奇的人来说,想想实例方法的类型是 class -> arguments -> result 并且是类的成员。)

【讨论】:

这是有道理的,但是我怎样才能将令牌转移到第二个视图?因为如果我在第二个视图中创建一个新的 ViewController 实例来调用 gettoken(),它不会设置任何令牌。 如何在不同的对象(在这个特定的视图控制器)之间传递任何类型的值是一个整体程序设计的问题,也是一个更大的问题,没有单一的答案。考虑如何传递其他值,考虑只传递令牌而不是视图控制器本身等。如果你不知道如何构建你的应用程序,你需要问一个新问题,提供足够的你的应用程序设计来解释问题,说出您尝试过的方法等,毫无疑问有人会帮助您。【参考方案2】:

您需要访问ViewController 的实例。它调用了VC_VerifyPhone

您可能需要在打开VC_VerifyPhone 时传递self 或返回与gettoken() 相同的值的某个闭包,或者可能还有其他一些方法。但无论如何,您需要将一些信息从ViewController 传递给VC_VerifyPhone

为什么不直接传token呢?

在你的UIViewController:

func gotoverifyphone()
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let verifyphone = storyboard.instantiateViewController(withIdentifier: "verifyphone") as! VC_VerifyPhone
    verifyphone.passedToken = token //<- pass your token directly
    OperationQueue.main.addOperation
        self.present(verifyphone, animated: true, completion: nil)
    

VC_VerifyPhone:

var passedToken: String?

@IBAction func btnVerifyPressed(_ sender: Any)
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    if let passedToken = passedToken  //Use the passed token here
        let token = "Bearer " + passedToken
        request.addValue("authorization", forHTTPHeaderField: token)
     else 
        //This may never happen, but you may need some output while debugging.
        print("VC_VerifyPhone opened without setting `passedToken`")
    

【讨论】:

【参考方案3】:

代码的结构方式要求您有一个ViewController 的实例,该实例具有其token 属性集。一旦你有了它,你就可以用viewController.getToken()代替ViewController.gettoken(ViewController)

您首先需要一个带有令牌的视图控制器。例如:

let controller = ViewController()
controller.settoken(newtoken: "abc123")

然后,您可以调用controller.getToken() 并将其插入到您的字符串中,如下所示:

let token = "Bearer " + controller.getToken()

【讨论】:

以上是关于二元运算符'+'不能应用于'String'和'() -> String'类型的操作数的主要内容,如果未能解决你的问题,请参考以下文章

二元运算符“==”不能应用于“字符串?”类型的操作数和 Swift 3 中的“布尔”

二元运算符“+”不能应用于“_”和“字符串”类型的操作数

二元运算符“==”不能应用于“布尔”和“字符串?”类型的操作数对于 2020 年的 Swift [重复]

二元运算符 % 不能应用于 UInt32 和 int 类型的操作数

二元运算符“===”不能应用于“任何?”类型的操作数和“UIBarButtonItem!”

Swift 3:二元运算符不能应用于 int 和“Int”类型的操作数?