模棱两可的追加使用?

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" 时,它可能会导致生成几种类型之一 – StringCharacterUnicodeScalar 或者可能是具有 [=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() 已弃用,不再可用。