元组在比较它们时会造成严重破坏

时间:2019-06-02 06:49:28

标签: swift

鉴于以下代码给了我错误。我不知道为什么我正在尝试比较两个元组。

我正在尝试学习Swift。

代码:

var a = (7, "Prannay");
var b = (9, "Bothra");
if (a > b){
  print("True \n" + a.0 + " " + a.1);
} else {
  print("False \n" + b.0 + " " + b.1);
}

Swift version 4.2.1 (swift-4.2.1-RELEASE)
 swiftc -o main main.swift
main.swift:4:19: error: binary operator '+' cannot be applied to operands of type 'String' and 'Int'
  print("True \n" + a.0 + " " + a.1);
        ~~~~~~~~~ ^ ~~~
main.swift:4:19: note: overloads for '+' exist with these partially matching parameter lists: (Int, Int), (String, String)
  print("True \n" + a.0 + " " + a.1);
                  ^
main.swift:6:20: error: binary operator '+' cannot be applied to operands of type 'String' and 'Int'
  print("False \n" + b.0 + " " + b.1);
        ~~~~~~~~~~ ^ ~~~
main.swift:6:20: note: overloads for '+' exist with these partially matching parameter lists: (Int, Int), (String, String)
  print("False \n" + b.0 + " " + b.1);
                   ^
compiler exit status 1

3 个答案:

答案 0 :(得分:1)

不是因为您比较了两个元组,而是因为您将IntString相加,并将代码更改为:

var a = (7, "Prannay");
var b = (9, "Bothra");
if (a > b){
    print("True \n" + "\(a.0)" + " " + a.1);
} else {
    print("False \n" + "\(b.0)" + " " + b.1);
}

有效。

答案 1 :(得分:0)

您不能如错误消息所述将Ints添加到字符串。对您的打印语句使用字符串插值,如下所示:

print("True \(a.0) \(a.1)")

答案 2 :(得分:0)

这里有+运算符的两种变体。

第一个是类型(Int, Int) -> Int的加法运算符。如果您执行2 + 2会导致4

,那么就会被调用

第二个是类型(String, String) -> String的字符串连接运算符。如果您执行"2" + "2"会导致"22",那么就会被调用。

您正在尝试混合匹配,因为没有+类型为(String, Int) -> String(Int, String) -> String的{​​{1}}变体,所以您无法做到这一点。

要使其工作,必须首先将所有整数显式转换为Strings:

let a = (7, "Prannay");
let b = (9, "Bothra");
if a > b {
  print("True \n" + String(a.0) + " " + a.1);
} else {
  print("False \n" + String(b.0) + " " + b.1);
}

更好的是,在这种情况下根本不使用String串联,而只是使用String插值,它会自动将任何类型转换为它的字符串表示形式:

let a = (7, "Prannay");
let b = (9, "Bothra");
if a > b {
  print("True \n\(a.0) \(a.1));
} else {
  print("False \n\(b.0) \(b.1));
}