2016-08-10 4 views
2
@IBAction func generateBtn(sender: UIButton) { 
    let strt = UInt32(strtNum.text!) 
    let end = UInt32(endNum.text!) 
    let ttlNums = Int(amtNums.text!) 

    let x = RandomNum() 


    var z = 0 

    while z<ttlNums{ 
     let y = x.rndNumGen(strt!, end: end!) 
     z += 1 
     var h = [String]() 
     h.append(String(y)) 
     let display:String = h.joinWithSeparator(", ") 

     winningNums.text = display 
     print (display) 

    }  
} 

이 코드의 문제점은 확실하지 않습니다. 문자열 표시를 레이블에 넣으려고 시도하고 난수 생성기의 마지막 번호를 인쇄합니다. 콘솔에 인쇄 할 때 모든 난수를 표시합니다.배열을 신속하게 레이블에 넣기

+2

(따라서 실패하고 nil를 반환 할 UInt32 초기화를 일으키는)가 아닌 문자열을 포함 할 때 무슨 일이 일어날 때 무슨 일을 처리하는 코드를 추가' while body는 항상 새로운 빈 변수'h'를 생성합니다. 이것은 의도 된 것입니까? – vadian

답변

1

여기서 중요한 문제는 배열이 모든 루프 반복에서 새로 만들어지고 루프 반복마다 레이블이 설정된다는 것입니다. 즉, 배열에는 해당 반복에서 만든 요소 만 포함되고 이후에는 새 배열로 재설정되고 새로운 요소가 추가됩니다. 배열은 처음 시작할 때 한 번만 초기화해야하고 루프에서 반복적으로 요소를 추가 한 다음 끝에 한 번 레이블에 넣어야합니다.

@IBAction func generateBtn(sender: UIButton) { 
    guard let startText = strtNum.text, let start = UInt32(startText), 
      let endText = endNum.text, let end = UInt32(endText), 
      let ttlText = amtNums.text, let ttlNums = UInt32(ttlText) else { 
       //one of these is nil, handle it gracefully here 
       return 
      } 

    let randomGenerator = RandomNum() 

    var h = [String]() 
    h.reserveCapacity(ttlNums) 
    for _ in 0..<ttlNums { 
     let randomNum = randomGenerator.rndNumGen(start, end: end) 
     h.append(String(RandomNum)) 
    } 

    let display = h.joinWithSeparator(", ") 

    winningNums.text = display 
    print(display) 
} 

나는 스위프트 모범 사례와 규칙에 맞춰이 코드를 가지고 몇 가지 다른 변경 한 :

  1. 이 기 해제를 강요하지 마십시오. if let 또는 guard let 바인딩을 사용하여 nil 값을 안전하게 처리하십시오.
  2. 변수에 의미있는 이름을 지정하십시오. 특정 경우를 제외하고는 단일 문자 이름을 사용하지 마십시오.
  3. 함수/메서드 이름 및 진행 대괄호 옆에 공백을 넣지 마십시오.
  4. 알려진 범위에서 반복 루프를 사용하지 마십시오. 대신 for in 루프를 사용하십시오.
  5. t3xtspk에 타이핑하지 마십시오. 틴에이저가 쓴 것처럼 보입니다. 자동 완성 기능으로 단어를 완성 할 수 있으므로 어쨌든 타이핑이 거의 끝나지 않습니다. 쉽게 읽고 읽을 수있게하십시오.

난 당신이 몇 가지 변경을 직접 만들 제안 :

  1. generateBtn 이름을 바꿉니다. 기능/방법 DO는 행동입니다. 이름은 동사 또는 동사로 지정해야합니다. 아마도 displayRandomArray과 같은 것을 시도해보십시오.
  2. 무작위 배열 생성을 고유 한 방법으로 리펙터링합니다.
  3. 이름 바꾸기 RandomNum. 외견 상 숫자가 아닙니다. 난수 발전기입니다. 아마도 시도하십시오 RandomNumberGenerator
  4. 이름 바꾸기 h.
  5. .text이 전무, 또는 그것이 UINT32에서
관련 문제