将Double转换为String会生成Optional

时间:2017-09-03 12:21:58

标签: swift

我正在从数据库中检索评级,需要将值设置为Double,将标签设置为String。我似乎无法将Double转换为String。调试区域中的标签和打印字符串均为读取 - 可选(3.0)

<ol class="pagination">

1 个答案:

答案 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)")
}

这里有几个问题:

  1. 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)")
    }
    
  2. 由于self.newRatingDouble?,因此无法与从String创建Double的常规字符串初始值设定项一起使用。 IDE抱怨这一点,并建议您使用String(describing:)代替。 String(describing:)会产生以下不良影响:

    • Double?的{​​{1}}变量将转换为1.23
    • {n}的"Optional(1.23)"变量将转换为Double?

    考虑到"nil"情况是不可能的(因为您刚刚将nil分配给self.rounded(myRating, toNearest:0.25)),并且字符串的self.newRating部分是不受欢迎的,这是您想要使用的内容。

    现在我们有Optional(...),一个非可选的roundedRating,我们可以调用Double的常规初始值设定项,其行为符合您的要求。

  3. 与#2类似,String的字符串插值(\(...))将产生self.ratingLabel.textOptional("some text"),因为{{1 nil的属性是可选的。这可能不是你想要的。您可以直接使用text局部变量,因为它具有非可选值。

    UILabel
  4. 既然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)")
    }
    
  5. 为什么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