无法将类型为`(Int, Bool, Int)`的值转换为指定类型`(Int, String?, String?)`。

huangapple go评论97阅读模式
英文:

Cannot convert value of type '(Int, Bool, Int)' to specified type '(Int, String?, String?)'

问题

I have started to explore Swift and I got a task from a lesson:

  1. You are given a tuple and it has 3 parameters:
  2. StatusCode(Int), Message(Optional String), ErrorMessage(Optional String);
  3. In case if the StatusCode is in a range [200...300] then you have to print the Message,
  4. otherwise you have to print the ErrorMessage.

The main idea in the task is that in case if any of last 2 parameters contains not a string then it has to contain nil because of the Optional String but in my case I get an error:

  1. Cannot convert value of type '(Int, Bool, Int)' to specified type '(Int, String?, String?)'

Here is what I did:

  1. let tupleResponse : (Int, String?, String?) = (200, true, 567)
  2. let (StatusCode, Message, ErrorMessage) = tupleResponse
  3. if tupleResponse.0 >= 200 && tupleResponse.0 <= 300 {
  4. if let checkStr1 = tupleResponse.1 {
  5. tupleResponse.1!
  6. } else {
  7. print("Message is nil")
  8. }
  9. } else {
  10. if let checkStr2 = tupleResponse.2 {
  11. tupleResponse.2!
  12. } else {
  13. print("Error Message is nil")
  14. }
  15. }
英文:

I have started to explore Swift and I got a task from a lesson:

  1. You are given a tuple and it has 3 parameters:
  2. StatusCode(Int), Message(Optional String), ErrorMessage(Optional String);
  3. In case if the StatusCode is in a range [200...300] then you have to print the Message,
  4. otherwise you have to print the ErrorMessage.

The main idea in the task is that in case if any of last 2 parameters contains not a string then <br>
it has to contain nil because of the Optional String but in my case I get en error:

  1. Cannot convert value of type &#39;(Int, Bool, Int)&#39; to specified type &#39;(Int, String?, String?)&#39;

Here is what I did:

  1. let tupleResponse : (Int, String?, String?) = (200, true, 567)
  2. let (StatusCode, Message, ErrorMessage) = tupleResponse
  3. if tupleResponse.0 &gt;= 200 &amp;&amp; tupleResponse.0 &lt;= 300 {
  4. if let checkStr1 = tupleResponse.1 {
  5. tupleResponse.1!
  6. } else {
  7. print(&quot;Message is nil&quot;)
  8. }
  9. } else {
  10. if let checkStr2 = tupleResponse.2 {
  11. tupleResponse.2!
  12. } else {
  13. print(&quot;Error Message is nil&quot;)
  14. }
  15. }

I was expecting that in case of "not string" data type it will make it nil, <br>
however it gives me that error.

答案1

得分: 1

你可以将你的检查合并,使它更简单。

  1. let tupleResponse: (statusCode: Int, message: String?, errorMessage: String?) = (200, "true", "567")
  2. // 检查并解包错误消息,检查无效的状态码
  3. if let errorMessage = tupleResponse.errorMessage, !(200...300).contains(tupleResponse.statusCode) {
  4. print(errorMessage)
  5. }
  6. // 检查有效的状态码,检查并解包消息
  7. else if 200...300 ~= tupleResponse.statusCode, let message = tupleResponse.message {
  8. print(message)
  9. } else { // 由于上述两种情况均检查了所描述的情况,这不应该发生。
  10. print("unexpected responses")
  11. }

在你的代码中,"true, 567" 的类型无效,如果你想发送任何类型。

  1. let tupleResponse: (statusCode: Int, message: Any?, errorMessage: Any?) = (200, true, 567)
  2. if let errorMessage = tupleResponse.errorMessage as? String, !(200...300).contains(tupleResponse.statusCode) {
  3. print(errorMessage)
  4. }
  5. else if 200...300 ~= tupleResponse.statusCode, let message = tupleResponse.message as? String {
  6. print(message)
  7. } else {
  8. print("unexpected responses")
  9. }

但在这里,你将会得到 "unexpected response",因为类型与你期望的不匹配。

  1. let tupleResponse: (statusCode: Int, message: Any?, errorMessage: Any?) = (200, "true", "567")
  2. if let errorMessage = tupleResponse.errorMessage as? String, !(200...300).contains(tupleResponse.statusCode) {
  3. print(errorMessage)
  4. }
  5. else if 200...300 ~= tupleResponse.statusCode, let message = tupleResponse.message as? String {
  6. print(message)
  7. } else {
  8. print("unexpected responses")
  9. }
英文:

You can combine your checks and make it a little simpler.

  1. let tupleResponse : (statusCode: Int, message: String?, errorMessage: String?) = (200, &quot;true&quot;, &quot;567&quot;)
  2. // Check and unwrap an error message, check invalid status code
  3. if let errorMessage = tupleResponse.errorMessage, !(200...300).contains(tupleResponse.statusCode){
  4. print(errorMessage)
  5. }
  6. // Check for valid status code, check and unwrap the message
  7. else if 200...300 ~= tupleResponse.statusCode, let message = tupleResponse.message {
  8. print(message)
  9. } else { // This should not happen since the above 2 cases check for both described scenarios.
  10. print(&quot;unexpected responses&quot;)
  11. }

In your code "true, 567" are of invalid types, if you want to send any type.

  1. let tupleResponse : (statusCode: Int, message: Any?, errorMessage: Any?) = (200, true, 567)
  2. if let errorMessage = tupleResponse.errorMessage as? String, !(200...300).contains(tupleResponse.statusCode){
  3. print(errorMessage)
  4. }
  5. else if 200...300 ~= tupleResponse.statusCode, let message = tupleResponse.message as? String{
  6. print(message)
  7. } else {
  8. print(&quot;unexpected responses&quot;)
  9. }

But here you will get "unexpected response" because the types don't match with what you expect.

  1. let tupleResponse : (statusCode: Int, message: Any?, errorMessage: Any?) = (200, &quot;true&quot;, &quot;567&quot;)
  2. if let errorMessage = tupleResponse.errorMessage as? String, !(200...300).contains(tupleResponse.statusCode){
  3. print(errorMessage)
  4. }
  5. else if 200...300 ~= tupleResponse.statusCode, let message = tupleResponse.message as? String{
  6. print(message)
  7. } else {
  8. print(&quot;unexpected responses&quot;)
  9. }

huangapple
  • 本文由 发表于 2023年6月15日 06:48:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/76478038.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定