值是可选的("myvalue"),如何获取只有值而没有可选部分。

9 浏览
0 Comments

值是可选的("myvalue"),如何获取只有值而没有可选部分。

我通过optional("myvalue")获得了我的value值,但是我如何只获得value而不带optional呢?我已经尝试了很多方法,但是没有找到解决办法,非常感谢任何帮助。事实上,我正在使用Firebase作为数据库并从数据库中获取值。我想获得性别、血型和国家代码的值。

Firebase连接:

ref.child("user_registration").child(UserID!).setValue(["username": fullName.text!, "email": emailTextField.text!, "contact": numberText.text!, "city": myCity.text!, "state":countryText.text!, "gender": genderGroup, "blood": bloodGroup,"code": countryGroup])

其他代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

if tableView == tableViewB {

let cell = tableViewB.dequeueReusableCell(withIdentifier: "blood", for: indexPath)

cell.textLabel!.text = dropDownList[indexPath.row]

return cell

}

else if tableView == genderT {

let cell = genderT.dequeueReusableCell(withIdentifier: "gender", for: indexPath)

cell.textLabel!.text = genderL[indexPath.row]

return cell

}

else {

let cell = countryT.dequeueReusableCell(withIdentifier: "country", for: indexPath) as! CountryTableViewCell

cell.countryLabel.text = countryL[indexPath.row]

cell.flagImage.image = countryFlags[indexPath.row]

return cell

}

}

var bloodGroup : String?

var genderGroup : String?

var countryGroup : String?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

if tableView == tableViewB {

let selectedData = dropDownList[indexPath.row]

buttonB.setTitle(selectedData, for: .normal)

self.tableViewB.isHidden = true

self.flag = 1

let indexPath = tableViewB.indexPathForSelectedRow

let currentCell = tableViewB.cellForRow(at: indexPath!)! as UITableViewCell

bloodGroup = currentCell.textLabel!.text!

print("\(bloodGroup)")

}

else if tableView == genderT {

let selectedDataG = genderL[indexPath.row]

genderB.setTitle(selectedDataG, for: .normal)

self.genderT.isHidden = true

self.flag = 1

let indexPath = genderT.indexPathForSelectedRow

let currentCell = genderT.cellForRow(at: indexPath!)! as UITableViewCell

genderGroup = currentCell.textLabel!.text!

print("\(genderGroup)")

}

else {

let selectedDataG = countryL[indexPath.row]

countryB.setTitle(selectedDataG, for: .normal)

self.countryT.isHidden = true

self.flag = 1

let indexPath = countryT.indexPathForSelectedRow

let currentCell = countryT.cellForRow(at: indexPath!)! as! CountryTableViewCell

countryGroup = currentCell.countryLabel.text!

let finalFlag = currentCell.flagImage.image!

print("\(finalFlag)" + "\(countryGroup)")

}

}

控制台:

com.apple.MobileAsset.TextInput.SpellChecker

Optional("male")

Optional("A+")

, {96, 64}Optional("+92")

致命错误:在解包可选值时意外发现为空值。

0
0 Comments

问题出现的原因是在使用Swift语言中的可选类型时,值被包装在Optional类型中,导致无法直接获取值而需要使用可选绑定或强制解包的方式。解决方法是在需要获取值的地方使用可选绑定或强制解包来提取值。

在给label赋值的代码中,使用了双问号(??)来处理可选值为空时的情况,但是这导致编译器给出了警告提示要删除双问号。为了解决这个问题,可以使用强制解包来获取值,或者使用可选绑定来进行安全地解包。

下面是修改后的代码示例:

// Print object

print(bloodGroup ?? "")

// Assign value to label

if let value = dropDownList[indexPath.row] {

cell.textLabel!.text = value

} else {

cell.textLabel!.text = ""

}

这样就可以在不使用双问号的情况下获取到值,并将其赋给label。通过可选绑定可以确保在值为空的情况下不会出现崩溃或错误。

0
0 Comments

在上述内容中,存在一个问题:在tableView的cellForRow方法中,设置了cell的textLabel的text属性为dropDownList[indexPath.row],而不是转换为String类型的dropDownList[indexPath.row]。这导致了在使用cell.textLabel!.text时,返回的值是一个Optional类型的值,即optional("myvalue"),而不是我们想要的"value"。

解决这个问题的方法是将cell.textLabel!.text的设置修改为cell.textLabel!.text = dropDownList[indexPath.row] as! String。这样可以将Optional类型的值转换为String类型的值,从而得到我们想要的"value"。以下是修改后的代码:

if tableView == tableViewB {

let cell = tableViewB.dequeueReusableCell(withIdentifier: "blood", for: indexPath)

cell.textLabel!.text = dropDownList[indexPath.row] as! String

return cell

}

这样修改后,我们就可以正确地得到"value",而不是optional("myvalue")。

0