ref : https://babbab2.tistory.com/86
앱 개발 중에 Text Box 들을 클릭해서 TextView 에 추가하는 기능을 구현해야 했다. 예를들어, "Apple", "Banana", "Cookie" 3 개의 Text Box 를 차례로 누르면 TextView 에 "Apple Banana Cookie" 가 작성된다.
그런데 Text Box 를 한번 더 클릭하면 삭제가 되야한다. 위 상황에서 가운데 있던 "Banana" 를 삭제하면 "Apple Cookie" 가 되야 자연스러울꺼다. 그리고 다시 "Banana" 를 클릭하면 "Apple Cookie Banana" 가 되도록 구현하고 싶었다. Text 길이가 길다면, 자료구조 중간에서 삭제가 많이 일어나는 경우에는 Array 보단 Linked List 를 활용하는게 좋다는건 모두가 알고 있다.
그래서 Swift 로 Linked List 를 구현해봤다.
string 에서 .removeLast() 를 활용하면 쉽게 마지막 문자열만 삭제할 수 있다.
import Foundation // ElementBoxInfo 는 텍스트 박스 인스턴스 class Node { var elementBoxInfo: ElementBoxInfo var next: Node? init(elementBoxInfo: ElementBoxInfo, next: Node? = nil){ self.elementBoxInfo = elementBoxInfo self.next = next } } class LinkedList { var head: Node? // tail 에 추가 func append(elementBoxInfo: ElementBoxInfo) { if head == nil { head = Node(elementBoxInfo: elementBoxInfo) return } var tempNode = head while tempNode?.next != nil { tempNode = tempNode?.next } tempNode?.next = Node(elementBoxInfo: elementBoxInfo) } // 중간 노드 삭제 func remove(elementBoxInfo: ElementBoxInfo) { if head == nil { return } // head 를 삭제할 경우 if head?.elementBoxInfo.idx == elementBoxInfo.idx { head = head?.next return } var tempNode = head while tempNode?.next?.elementBoxInfo.idx != elementBoxInfo.idx { tempNode = tempNode?.next } tempNode?.next = tempNode?.next?.next } // TextView 에 띄워줄 String 리턴 함수 func getTextWithLinkedList() -> String? { if head == nil { return nil } var resultText: String = "" var tempNode = head while tempNode != nil { guard let tempText = tempNode?.elementBoxInfo.text else { return nil } resultText += tempText + " " tempNode = tempNode?.next } resultText.removeLast() return resultText } }