티스토리 뷰

iOS 기초

[swift] foreach 사용해보기

순진이 2021. 11. 19. 19:14

오늘은 저도 첫 번째 스터디를 통해 배운 너무나 유용한 기능,,,

물론 아직은 기초 단계지만! 제가 배운 걸 적어보겠습니당!

 


 

foreach는 고차함수라고 배웠는데 알고보니, 메서드네여?! 

배열의 각 아이템(요소)을 잘 활용하여 각 아이템(요소)별로 특정 작업을 실행합니다.

어떠한 작업을 할지는 클로저를 통해 개발자가 정해주면 되겠습니다.

 

 

이렇게 말해도 무슨 말인지 잘 모르겠쥬?

저 또한 몰랐으니까요?

 

 

그래서 간단한 예제를 통해 보여드리도록 하겠습니다.

 


 

오늘의 예제는 3개의 레이블을 뷰에 올려보는 간단한 예제입니당.

 

레이블들을 뷰에 올릴 때 공통으로 해줄 작업이 있져?

바로 addSubview 작업과 오토레이아웃 작업입니다.

 

이때 foreach문을 쓰면 코드가 엄청 간결해지더라구요!

 

우선 저의 가장 첫 번째 글이었던, 버튼을 누르면 뷰가 바뀌었던 예제의 코드를 가져와볼게요.

//
//  ViewController.swift
//  ViewChange
//
//  Created by 순진이 on 2021/10/27.
//
import UIKit
import SnapKit

class ViewController: UIViewController {
    
    
    
    let redButton = UIButton()
    let blueButton = UIButton()
    let greenButton = UIButton()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        redButton.setTitle("", for: .normal)
        redButton.backgroundColor = .red
        redButton.layer.cornerRadius = 10
        view.addSubview(redButton)
        redButton.addTarget(self, action: #selector(redBtnTapped(_:)), for: .touchUpInside)
        
        
        blueButton.setTitle("", for: .normal)
        blueButton.backgroundColor = .blue
        blueButton.layer.cornerRadius = 10
        view.addSubview(blueButton)
        blueButton.addTarget(self, action: #selector(blueBtnTapped), for: .touchUpInside)
        
        
        greenButton.setTitle("", for: .normal)
        greenButton.backgroundColor = .green
        greenButton.layer.cornerRadius = 10
        view.addSubview(greenButton)
        greenButton.addTarget(self, action: #selector(greenBtnTapped), for: .touchUpInside)
        
        redButton.translatesAutoresizingMaskIntoConstraints = false
        blueButton.translatesAutoresizingMaskIntoConstraints = false
        greenButton.translatesAutoresizingMaskIntoConstraints = false
        
	//오토레이아웃 생략  
    
    }
    
    //버튼 이벤트 설정 코드 생략,,,
    //@objc func redBtnTapped(_ button: UIButton) { 생략 }
    //@objc func blueBtnTapped(_ button: UIButton) { 생략 }
    //@objc func greenBtnTapped(_ button: UIButton) { 생략 }
}

이 긴 코드를 foreach를 이용해 어떻게 바꿀 수 있냐!

//
//  ViewController.swift
//  ViewChange
//
//  Created by 순진이 on 2021/10/27.
//
import UIKit
import SnapKit

class ViewController: UIViewController {
          
    let redButton = UIButton()
    let blueButton = UIButton()
    let greenButton = UIButton()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        redButton.backgroundColor = .red
        redButton.addTarget(self, action: #selector(redBtnTapped(_:)), for: .touchUpInside)
            
        blueButton.backgroundColor = .blue
        blueButton.addTarget(self, action: #selector(blueBtnTapped), for: .touchUpInside)
                        
        greenButton.backgroundColor = .green    
        greenButton.addTarget(self, action: #selector(greenBtnTapped), for: .touchUpInside)

        
        setBasic()
   
   //foreach 활용
   func setBasic() {
        [redButton, blueButton, greenButton].foreach { (Btn) in
            Btn.setTitle("", for: .normal)
            Btn.layer.cornerRadius = 10
            view.addSubview(Btn)
            Btn.translatesAutoresizingMaskIntoConstraints = false
    }
    
	//오토레이아웃 생략  
    
    }
    
    //버튼 이벤트 설정 코드 생략,,,
    //@objc func redBtnTapped(_ button: UIButton) { 생략 }
    //@objc func blueBtnTapped(_ button: UIButton) { 생략 }
    //@objc func greenBtnTapped(_ button: UIButton) { 생략 }
}

 

 

setBasic이라는 함수를 만들어 거기서 전부 설정해 보았어요.

배열에 있던 세 가지 버튼을 하나씩 뽑아서 개발자가 정한 작업을 해주게 됩니다.

 

그러니까, 공통된 아래 가지 작업을 버튼을 하나씩 뽑아 실행하게 되는거죠

redButton.setTitle

redButton.layer.cornerRadius

view.addSubview(redButton)

translatesAutoresizingMaskIntoConstraints = false

 

 

엄청 간결해지지 않나요?

 

아규먼트로 썼던 (Btn)과 in도 생략할 수 있기 때문에 더 간략하게 작성할 수도 있답니다.

이때는 생략하는 대신 $0라고 써주면 됩니다. 

두 번째 파라미터는 $1, 세 번째는 $2으로 써주면 되구요!

   //foreach 활용
   func setBasic() {
        [redButton, blueButton, greenButton].foreach { 
            $0.setTitle("", for: .normal)
            $0.layer.cornerRadius = 10
            view.addSubview($0)
            $0.translatesAutoresizingMaskIntoConstraints = false
    }

 

오늘의 짧은 정리 끝!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크