模棱两可的追加使用?
Ambiguous use of append?
我正在尝试使用 Swift 制作一个基本计算器,但我不知道如何在按下数字时将数字添加到顶部。每次按下按钮时,我都试图将数字附加到字符串中,但出现错误 "Ambiguous use of append"。导致此错误的代码有什么问题?如何修复它才能正常运行?
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var oneButton: UIButton!
@IBOutlet weak var textField: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func onePressed(sender: AnyObject) {
textField.text?.append("1")
}
}
您可以使用 +
来连接字符串。
像这样使用:
@IBAction func onePressed(sender: AnyObject)
{
if let txt = textField?.text
{
textField?.text = txt + "1"
}
}
注意 Swift 中处理集合的惯例是:append
将单个元素添加到集合的末尾,extend
添加另一个集合的内容。对于字符串,这意味着 append
添加单个字符,而 extend
添加其他字符串(或其他字符集合或序列,例如数组)。
在追加的情况下,String
有两个追加函数。一个拿一个Character
,一个拿一个UnicodeScalar
。两者都被称为追加。
如果您在字符串变量上获得完成弹出窗口,您可以看到它们:
你需要告诉Swift你想要哪一个:
textField.text?.append(“1” as Character)
或
textField.text?.append(“1” as UnicodeScalar)
这种歧义是由于 ""
之间只有一个字符时文字转换的多重重载造成的。当您编写 "a"
时,它可能会导致生成几种类型之一 – String
、Character
、UnicodeScalar
或者可能是具有 [=25 的自定义类型=] 实现(比如表示 URL 的类型)。 String
被排除(append
不带一个)但仍然剩下另外两个。
另一方面,如果您已经有一个 Character
变量,则无需消除歧义:
let c: Character = "a"
textField.text?.append(c) // no ambiguity
Swift 根据上下文决定(即潜在匹配函数调用的参数类型可能是什么)。其他解决方案建议使用 +
连接运算符,或 .extend()
。 +=
也可以。这些不是模棱两可的,因为它们没有超载——它们只需要一个 String
(或者在 extend
的情况下,另一个字符集合,这就是 String
是什么),并且因此 Swift 可以在没有任何帮助的情况下选择从文字到 String
的转换。
问题是您使用的是 append
,而您的意思是 extend
。写到这里,一切都会好起来的:
textField.text?.extend("1")
将字符串附加到字符串
虽然接受的答案在技术上是正确的并且是一个非常好的答案,但似乎(我的假设)OP 试图做的所有事情都是将字符串附加到字符串而不是将 UnicodeScalar 或字符文字附加到字符串。
如果那是你的意图,我想大多数用户都想做类似的事情,请使用 .appendContentsOf(other: String)
。
textfield.text?.appendContentsOf("1")
此外,.extend()
已弃用,不再可用。
我正在尝试使用 Swift 制作一个基本计算器,但我不知道如何在按下数字时将数字添加到顶部。每次按下按钮时,我都试图将数字附加到字符串中,但出现错误 "Ambiguous use of append"。导致此错误的代码有什么问题?如何修复它才能正常运行?
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var oneButton: UIButton!
@IBOutlet weak var textField: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func onePressed(sender: AnyObject) {
textField.text?.append("1")
}
}
您可以使用 +
来连接字符串。
像这样使用:
@IBAction func onePressed(sender: AnyObject)
{
if let txt = textField?.text
{
textField?.text = txt + "1"
}
}
注意 Swift 中处理集合的惯例是:append
将单个元素添加到集合的末尾,extend
添加另一个集合的内容。对于字符串,这意味着 append
添加单个字符,而 extend
添加其他字符串(或其他字符集合或序列,例如数组)。
在追加的情况下,String
有两个追加函数。一个拿一个Character
,一个拿一个UnicodeScalar
。两者都被称为追加。
如果您在字符串变量上获得完成弹出窗口,您可以看到它们:
你需要告诉Swift你想要哪一个:
textField.text?.append(“1” as Character)
或
textField.text?.append(“1” as UnicodeScalar)
这种歧义是由于 ""
之间只有一个字符时文字转换的多重重载造成的。当您编写 "a"
时,它可能会导致生成几种类型之一 – String
、Character
、UnicodeScalar
或者可能是具有 [=25 的自定义类型=] 实现(比如表示 URL 的类型)。 String
被排除(append
不带一个)但仍然剩下另外两个。
另一方面,如果您已经有一个 Character
变量,则无需消除歧义:
let c: Character = "a"
textField.text?.append(c) // no ambiguity
Swift 根据上下文决定(即潜在匹配函数调用的参数类型可能是什么)。其他解决方案建议使用 +
连接运算符,或 .extend()
。 +=
也可以。这些不是模棱两可的,因为它们没有超载——它们只需要一个 String
(或者在 extend
的情况下,另一个字符集合,这就是 String
是什么),并且因此 Swift 可以在没有任何帮助的情况下选择从文字到 String
的转换。
问题是您使用的是 append
,而您的意思是 extend
。写到这里,一切都会好起来的:
textField.text?.extend("1")
将字符串附加到字符串
虽然接受的答案在技术上是正确的并且是一个非常好的答案,但似乎(我的假设)OP 试图做的所有事情都是将字符串附加到字符串而不是将 UnicodeScalar 或字符文字附加到字符串。
如果那是你的意图,我想大多数用户都想做类似的事情,请使用 .appendContentsOf(other: String)
。
textfield.text?.appendContentsOf("1")
此外,.extend()
已弃用,不再可用。