append的使用含义不明确?

5

我正在尝试使用Swift制作一个基本的计算器,但是我无法弄清楚如何在按下数字时将它们添加到顶部。我尝试每次按下按钮时将数字附加到字符串中,但是我得到了错误“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")

    }

}
4个回答

13

在 Swift 中处理集合时的惯例是:append 将单个元素添加到集合的末尾,extend 则将另一个集合的内容添加进来。对于字符串而言,append 添加单个字符,而 extend 添加其他字符串(或其他集合或字符序列,例如数组)。

关于 appendString 有两个函数可用于追加。其中一个接受 Character,另一个接受 UnicodeScalar。不过它们都被称为 append。

如果在字符串变量上获取完成弹出窗口,可以看到它们:

image of completion options for String.append

你需要告诉 Swift 你想要哪一个。

textField.text?.append(“1” as Character)
或者
textField.text?.append(“1” as UnicodeScalar)
这种歧义是由于在 "" 之间只有一个字符时,字面转换的多个重载所致。当您编写 "a" 时,可能会生成多种类型 - StringCharacterUnicodeScalar 或者具有 StringLiteralConvertible 实现的自定义类型(比如表示 URL 的类型)。String 被排除了(append 不接受),但还有另外两种可能。
另一方面,如果您已经有了一个 Character 变量,则无需消除歧义:
let c: Character = "a"
textField.text?.append(c) // no ambiguity

Swift会根据上下文来做出决定(例如,可能匹配的函数调用参数的类型是什么)。其他解决方案建议使用+ 连接运算符或.extend()+= 也可以。它们之间没有歧义,因为它们没有被重载 - 它们只接受一个String(或在extend的情况下,另一个字符集合,这就是String的含义),因此Swift可以自行选择从字面量到String的转换,而无需任何帮助。


谢谢你的提示!我之前不知道 Swift 中有“as”语法。 - user4258987

4

您可以使用 + 来连接字符串。

用法如下:

@IBAction func onePressed(sender: AnyObject)
{
    if let txt = textField?.text
    {
        textField?.text = txt + "1"
    }
}

为什么我不能在顶部定义let txt = textField.text和所有按钮输出?这样做会更加高效。 - user4258987
@Physics137:我不太明白你在问什么,你能再解释一下吗? - Midhun MP
如果我能在代码的顶部放置let txt = textField.text,而不是在函数内部,那么我就可以只写一次let txt = textField?.text,然后直接说**textField?.text = txt + "number"**,而不必重复输入。 - user4258987
@Physics137:因为当你初始化类时,textField将是nil。而且当你一遍又一遍地按按钮时,textField的值会改变。所以最好在IBAction方法中初始化该值。 - Midhun MP

2
问题在于你使用了append,而应该使用extend。按照以下方式书写代码即可解决问题:
 textField.text?.extend("1")

1
谁说他们的意思是“扩展”?意图可能是追加一个字符。仅仅因为“扩展”是明确的,并不意味着那是正确的解决方案,这只是掩盖问题的表象... - Airspeed Velocity
1
@AirspeedVelocity,虽然我非常尊重您的工作,但这将是那种情况之一,您说您的话,我说我的话。 - matt

0

将字符串附加到字符串

虽然被接受的答案在技术上是正确的,而且非常好,但似乎(我的假设)所有OP想要做的就是将一个字符串附加到另一个字符串,而不是将UnicodeScalar或字符文字附加到字符串中。

如果这是您的意图,并且我认为大多数用户都想做类似的事情,请使用.appendContentsOf(other: String)

textfield.text?.appendContentsOf("1")

此外,.extend()已被弃用,不再可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接