xcode 无法将“()”类型的值转换为预期的参数类型“String”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/48106979/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Cannot convert value of type '()' to expected argument type 'String'
提问by hg56
I am taking the zip code entered by my user and converting it into a City name. After it is converted to the City name I will save the information into my Firebase Database. I am getting an error "Cannot convert value of type '()' to expected argument type 'String'" when I try to do this. I am getting the zip code from a text field and passing it from the previous ViewController. error
我正在获取用户输入的邮政编码并将其转换为城市名称。将其转换为城市名称后,我会将信息保存到我的 Firebase 数据库中。当我尝试执行此操作时,出现错误“无法将类型 '()' 的值转换为预期的参数类型 'String'”。我从文本字段中获取邮政编码并从前一个 ViewController 传递它。 错误
//first ViewController
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
if let destination = segue.destination as? SignUpSecondViewController{
destination.zipCode = zipCodeInput.text!
destination.name = nameText.text!
destination.email = emailText.text!
destination.password = passwordText.text!
destination.pictureData = userImageView.image!
}}
}
//second ViewController
var zipCode = String()
func getLocationFromPostalCode(postalCode : String){
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(postalCode) {
(placemarks, error) -> Void in
// Placemarks is an optional array of type CLPlacemarks, first item in array is best guess of Address
if let placemark = placemarks?[0] {
if placemark.postalCode == postalCode{
// you can get all the details of place here
print("\(placemark.locality)")
print("\(placemark.country)")
}
else{
print("Please enter valid zipcode")
}
}
}
}
@IBAction func completeButtonAction(_ sender: Any) {
let nameText = name
let emailField = email.lowercased()
let finalEmail = emailField.trimmingCharacters(in: .whitespacesAndNewlines)
let location = getLocationFromPostalCode(postalCode: zipCode)
let biography = bioTextView.text!
let passwordText = password
let interests = options.joined(separator: " , ")
var pictureD: NSData?
if let imageView = self.sentPic.image {
pictureD = UIImageJPEGRepresentation(self.sentPic.image!, 0.70) as! NSData
}
if finalEmail.isEmpty || biography.isEmpty || password.isEmpty || pictureD == nil {
self.view.endEditing(true)
let alertController = UIAlertController(title: "OOPS", message: " You must fill all the fields", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
present(alertController, animated: true, completion: nil)
}else {
SVProgressHUD.show()
self.view.endEditing(true)
authService.signUP(firstLastName: nameText, email: finalEmail, location: location, biography: biography, password: password, interests: interests, pictureData: pictureD as NSData!)
}
SVProgressHUD.dismiss()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "NewTabBarViewController") as! UIViewController
// Alternative way to present the new view controller
self.navigationController?.present(vc, animated: true, completion: nil)
}
采纳答案by rmaddy
Your problem begins with this line:
你的问题从这一行开始:
let location = getLocationFromPostalCode(postalCode: zipCode)
The problem is that your getLocationFromPostalCode
has no return value so the compiler thinks that the implicit type of location
is ()
which means a function with no return (void) type.
问题是你getLocationFromPostalCode
没有返回值所以编译器认为隐式类型location
is()
这意味着一个没有返回(void)类型的函数。
So, in theory, you would want to change:
所以,理论上,你会想要改变:
func getLocationFromPostalCode(postalCode : String) {
to:
到:
func getLocationFromPostalCode(postalCode : String) -> String {
and have the function return a String
value.
并让函数返回一个String
值。
But, you can't do that either since the implementation of your getLocationFromPostalCode
consists of getting the location from an asynchronous network call.
但是,您也不能这样做,因为您的实现getLocationFromPostalCode
包括从异步网络调用中获取位置。
The proper solution is to rewrite that function to take a completion handler that returns the obtained location.
正确的解决方案是重写该函数以获取返回获取位置的完成处理程序。
func getLocationFromPostalCode(postalCode: String, completion: (String?) -> Void) {
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(postalCode) { (placemarks, error) -> Void in
// Placemarks is an optional array of type CLPlacemarks, first item in array is best guess of Address
if let placemark = placemarks?.first {
if placemark.postalCode == postalCode {
// you can get all the details of place here
print("\(placemark.locality)")
print("\(placemark.country)")
completion(placemark.locality) // or whatever value you want
return
}
else{
print("Please enter valid zipcode")
}
}
completion(nil) // no location found
}
}
Now, with that all fixed up, you need to redo how you get the location.
现在,所有这些都解决了,您需要重做获取位置的方式。
@IBAction func completeButtonAction(_ sender: Any) {
var pictureD: Data? = nil
if let imageView = self.sentPic.image {
pictureD = UIImageJPEGRepresentation(imageView, 0.70)
}
let emailField = email.lowercased()
let finalEmail = emailField.trimmingCharacters(in: .whitespacesAndNewlines)
let biography = bioTextView.text!
let passwordText = password
if finalEmail.isEmpty || biography.isEmpty || password.isEmpty || pictureD == nil {
self.view.endEditing(true)
let alertController = UIAlertController(title: "OOPS", message: " You must fill all the fields", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
present(alertController, animated: true, completion: nil)
}else {
getLocationFromPostalCode(postalCode: zipCode) { (location) in
guard let location = location else {
print("no location")
return
}
let nameText = name
let interests = options.joined(separator: " , ")
SVProgressHUD.show()
self.view.endEditing(true)
authService.signUP(firstLastName: nameText, email: finalEmail, location: location, biography: biography, password: password, interests: interests, pictureData: pictureD!)
SVProgressHUD.dismiss()
}
}
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "NewTabBarViewController") as! UIViewController
// Alternative way to present the new view controller
self.navigationController?.present(vc, animated: true, completion: nil)
}