2017-09-03 1 views
0

데이터베이스에서 등급을 가져오고 값을보기로 Double로 설정하고 레이블을 문자열로 설정해야합니다. Double을 String으로 변환 할 수 없습니다. 라벨 모두 읽고 디버그 영역에 인쇄 된 문자열 - 선택 (3.0)Double을 문자열로 변환하는 옵션 생성

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)") 
} 
+0

왜 옵션을 사용하지 않으시겠습니까? – Carcigenicate

+0

그것은 선택 문자열이 아닌 unwrap을 강요 할 수 없다는 것이 이상하다. 나는 그것을 다음과 같이 시도했다. stringValue = String (self.newRating을 기술한다)! –

+0

stringValue는 String (선택 사항이 아님)이지만 self.ratingLabel.text는 선택 사항입니다. – algrid

답변

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)을 할당하면이 값을 0이 아닌 값으로 설정할 수 있지만 사용하려고 시도 할 때 강제로 적용을 해제해야합니다. 대신, 비 선택 지역 변수에 식의 값을 추출하십시오 Double?했다

    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.newRating 때문에, 그것은 Double에서 String을 만들어 일반 문자열 이니셜 라이저와 함께 사용할 수 없습니다. IDE는이 문제에 대해 불평하고 대신 String(describing:)을 사용할 것을 제안했습니다.

    • 1.23의 값을 갖는 변수 Double?"Optional(1.23)"로 변환된다 : String(describing:)는 다음, 바람직하지 않은 효과를 가질 것이다. 이것이, (당신은 단지 self.newRatingself.rounded(myRating, toNearest:0.25)을 할당했기 때문에) 전무는 nil 경우를 고려 "nil"

    로 전환 될 것입니다

  3. Double? 변수는 불가능하고, 문자열의 Optional(...) 부분은 바람직하지 않다 아니요 원하는 것을 사용하고 싶습니다.

    이제 우리는 roundedRating, 비 선택 Double을 가지고, 우리는 당신이 원하는대로 동작 String의 정규 초기화를 호출 할 수 있습니다. UILabeltext 속성은 선택 사항이기 때문에 # 2에 유사한 방식으로

  4. , self.ratingLabel.text의 문자열 보간 (\(...))는 Optional("some text") 또는 nil을 얻을 것 중 하나. 이것은 아마도 당신이하려고하는 것이 아닙니다. 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 한 곳에서만 사용되며, 어떤 설명 정보를 제공하지 않기 때문에 (우리는 문자열의 것을 볼 수 있고, 분명히이 값입니다) 오직 self.ratingView.rating의 가치를 반영거야 경우,

    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)") 
    } 
    
  6. self.newRating이 존재 : 코드를 단순화? 이것은 실수로 하나를 변경하여 발생하는 버그의 가능성을 소개합니다. newRating 값이 self.ratingView.rating에서 파생 된 계산 된 속성을 만들거나 완전히 제거하고 self.ratingView.rating 만 사용하십시오.

관련 문제