二元运算符“+”不能应用于 'String' 类型的操作数和“字符串感叹号”

Binary operator '+' cannot be applied to operands of type 'String' and 'String exclamationmark

我正在生成一个 QRCode,其中包含在注册表中输入的姓名、电子邮件和 phone 用户数量。在 RegistrationVC 中,我使用 userdefaults 来保存所有这 3 个字段。现在在我的 QRGenerate VC 中,在用户默认值的帮助下我想生成 QR 码,但抛出错误

Binary operator '+' cannot be applied to operands of type 'String' and 'String!".

我将所有三个键传递给一个字符串 (i.e.qrgeneratestring) 并生成二维码。

phoneKeyValue = UserDefaults.standard.string(forKey: "phoneKey")
nameKeyValue = UserDefaults.standard.string(forKey: "nameKey")
emailidKeyValue = UserDefaults.standard.string(forKey: "emailIDKey")
var qrgeneratestring = nameKeyValue + emailidKeyValue + phoneKeyValue


    if qrgeneratestring.isEmpty == false{
        let ciImageFromQRCode = generateQRCodeFromString(strQR: qrgeneratestring)
        let scaleX = (imgViewQRCode.frame.size.width / ciImageFromQRCode.extent.size.width)
        let scaleY = (imgViewQRCode.frame.size.height / ciImageFromQRCode.extent.size.height)
        let imgTransformed = ciImageFromQRCode.applying(CGAffineTransform(scaleX: scaleX, y: scaleY))
        imgViewQRCode.image = UIImage(ciImage: imgTransformed)

    }

string(forKey returns 一个可选的,你需要解包三个值,你必须声明变量为非可选的

var phoneKeyValue = ""
var nameKeyValue = ""
var emailidKeyValue = ""

let defaults = UserDefaults.standard
phoneKeyValue = defaults.string(forKey: "phoneKey") ?? ""
nameKeyValue = defaults.string(forKey: "nameKey") ?? ""
emailidKeyValue = defaults.string(forKey: "emailIDKey") ?? ""

UserDefaults 方法 string(forKey:...) returns 一个可选的 - 这是一个可以是 String 类型或 nil 类型的值。

您需要使用感叹号 ! 或使用合并运算符 ?? 来解包可选。这取决于您是否知道该值不能为 nil(因此您使用感叹号)或者当可选值为 nil 值时您提供默认值。

在这种情况下我会使用:

phoneKeyValue = UserDefaults.standard.string(forKey: "phoneKey") ?? ""
nameKeyValue = UserDefaults.standard.string(forKey: "nameKey") ?? ""
emailidKeyValue = UserDefaults.standard.string(forKey: "emailIDKey") ?? ""
var qrgeneratestring = nameKeyValue + emailidKeyValue + phoneKeyValue