我正在从数据库中检索评级,需要将值设置为Double,将标签设置为String。我似乎无法将Double转换为String。调试区域中的标签和打印字符串均为读取 - 可选(3.0)
<ol class="pagination">
答案 0 :(得分:3)
if let myRating = Double(myString) {
self.newRating = self.rounded(myRating, toNearest:0.25)
self.ratingView.rating = self.newRating!
let stringValue = String(describing: self.newRating)
self.ratingLabel.text = stringValue
print("My rating label is: \(self.ratingLabel.text)")
}
这里有几个问题:
self.newRating
是可选的。你为它指定self.rounded(myRating, toNearest:0.25)
,这使它成为非零,但当你试图使用它时,你仍然被迫强行打开它。相反,将表达式值提取到非可选的局部变量:
if let myRating = Double(myString) {
let roundedRating = self.rounded(myRating, toNearest:0.25)
self.newRating = roundedRating
self.ratingView.rating = roundedRating
let stringValue = String(roundedRating)
self.ratingLabel.text = stringValue
print("My rating label is: \(self.ratingLabel.text)")
}
由于self.newRating
是Double?
,因此无法与从String
创建Double
的常规字符串初始值设定项一起使用。 IDE抱怨这一点,并建议您使用String(describing:)
代替。 String(describing:)
会产生以下不良影响:
Double?
的{{1}}变量将转换为1.23
。"Optional(1.23)"
变量将转换为Double?
考虑到"nil"
情况是不可能的(因为您刚刚将nil
分配给self.rounded(myRating, toNearest:0.25)
),并且字符串的self.newRating
部分是不受欢迎的,这是不您想要使用的内容。
现在我们有Optional(...)
,一个非可选的roundedRating
,我们可以调用Double
的常规初始值设定项,其行为符合您的要求。
与#2类似,String
的字符串插值(\(...)
)将产生self.ratingLabel.text
或Optional("some text")
,因为{{1 nil
的属性是可选的。这可能不是你想要的。您可以直接使用text
局部变量,因为它具有非可选值。
UILabel
既然roundedRating
仅在一个地方使用,并且由于它不提供任何描述性信息(我们可以看到它是一个字符串,显然它是一个值),我们应该只是内联它简化了代码:
if let myRating = Double(myString) {
let roundedRating = self.rounded(myRating, toNearest:0.25)
self.newRating = roundedRating
self.ratingView.rating = roundedRating
let stringValue = String(roundedRating)
self.ratingLabel.text = stringValue
print("My rating label is: \(roundedRating)")
}
为什么stringValue
存在,如果它只能反映if let myRating = Double(myString) {
let roundedRating = self.rounded(myRating, toNearest:0.25)
self.newRating = roundedRating
self.ratingView.rating = roundedRating
self.ratingLabel.text = String(roundedRating)
print("My rating label is: \(roundedRating)")
}
的值?这引入了错误的可能性,这些错误源于意外地改变一个错误,而不记得反映另一个错误的变化。将self.newRating
作为其值来自self.ratingView.rating
的计算属性,或者将其完全删除并仅使用newRating
。