iOS/iOS SeSAC 2기 TIL

iOS swift UILabel에 랜덤으로 값 정해주기

Developer-Michelle 2022. 7. 16. 14:14

 override func viewDidLoad() {

        super.viewDidLoad()

        firstLabel.text = setUserNickname()

        view.backgroundColor = example().0 //아래 적은 튜플의 첫번째 요소인 UIColor

        emotionFirstButton.setImage(UIImage(named: example().2), for: .normal) //첫번째 버튼의 이미지

}

 

//배경색, 레이블, 이미지 - 타입의 제약 없이 쓸 수 있는건 튜플로 ( )

    func example() -> (UIColor, String, String) {

        let color: [UIColor] = [.yellow, .red, .systemPink]

        let image: [String] = ["sesac_slime6", "sesac_slime7", "sesac_slime8", "sesac_slime5"]

        return (color.randomElement()!, "고래밥", image.randomElement()!)

    }

    

    func setUserNickname() -> String {

        let nickname = ["고래밥", "칙촉", "격투가"]

        let select = nickname.randomElement()!

        return "저는 \(select)입니다."

    }

 

단, 위의 방법은 UILabel이 하나일 경우에만 쓸 수가 있다.

 

UILabel이 여러개이고 랜덤으로 값을 뿌려줘야되는 경우는 다른 방법으로 해야함.

아래는 UIButton이 여러개이고 랜덤으로 값을 뿌려줘야하는 경우에 대한 것임: (setTitle이용)

for 문 또는 while 문으로 해서 돌려줘야함

 

hashTags[i].setTitle(randomKeys[i], for: .normal)

 

 

 //버튼 4개에 랜덤으로 신조어단어를 뿌려준다 (Enum 값 중에 가져와서 setTitle로 뿌려준다)

    func randomWords() {

        //중복 방지를 위해 newWords를 가져오기 위한 선언

        var container: [String] = [ ] // 비어있는 배열. while을 돌면서 [윰차, 실매, 꾸안꾸... ] 식으로 쌓임.

        while container.count < 4 {

            let newWord = Enum.allCases.randomElement()! //enum을 가져오는거. 6개 중 하나의 값. 윰차

            let data = newWord.rawValue //enum을 String형태로 가져온다. "윰차"

            

            if !container.contains(data) {

                buttonList[container.count].setTitle(data, for: .normal)

                container.append(data)

            }

        }

    }

 

 

위 코드 부연 설명>>

 

.randomElement() 의 형태를 알 수 있는 방법: ctrl + space바 = enum형태임을 알 수 있다.

.rawValue의 형태는 string

 

 

https://hanulyun.medium.com/swift-enum-allcases%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81-4cc0514d0f22 

 

(Swift) Enum AllCases를 활용한 리팩토링

Swift 5.1 기준

hanulyun.medium.com

CaseIterable & Conclusion

그래서 검색하다가 알게된 CaseIterable 프로토콜. AllCases를 얻을 수 있어요.

enum: CaseIterable { // 추가
  // static let allItems 는 지운다
}
func printDemoText(_ index: Int) {
  var demoText: String? // 로그 찍을 변수
  
  DemoFlag.allCases.forEach { // allCases를 가져올 수 있다.
    if $0.rawValue.index == index {
      demoText = $0.rawValue.text
    }
  print("text = \(demoText)")
}