二元运算符'+'不能应用于'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 类型的操作数