二进制运算符'+'不能应用于'String'和'String exclamationmark类型的操作数

时间:2017-10-21 19:16:35

标签: ios swift nsstring nsuserdefaults

我正在生成一个QRCode,其中包含以注册形式输入的用户名,电子邮件和电话号码。在RegistrationVC中,我使用了userdefaults来保存所有这3个字段。现在在我的QRGenerate VC中,在用户默认的帮助下,我想生成QR码,但是抛出错误

  

二进制运算符'+'不能应用于'String'和'String!'类型的操作数。

我将所有三个键传递给一个字符串(即qrgeneratestring)并生成QRCodes。

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)

    }

enter image description here

2 个答案:

答案 0 :(得分:0)

string(forKey返回一个可选项,您需要打开这三个值,并且必须将变量声明为非可选

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") ?? ""

答案 1 :(得分:0)

UserDefaults方法string(forKey:...)返回一个可选项 - 这个值可以是String类型,也可以是nil。

您需要使用感叹号!或使用coalesence运算符??来展开可选项。这取决于您是否知道值不能为零(因此使用感叹号),或者当optional是nil值时提供默认值。

在这种情况下,我会使用:

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