Advertisement
HXXXXJ

View Hierarchy Iterator

Mar 26th, 2019
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 1.94 KB | None | 0 0
  1.  
  2. class UIView{
  3.     var subViews : [UIView]
  4.     var superView : UIView?
  5.     var val : Character
  6.     init(_ char: Character) {
  7.         subViews = [UIView]()
  8.         val = char
  9.     }
  10. }
  11.  
  12.  
  13.  
  14. let A = UIView("A")
  15. let B = UIView("B")
  16. let C = UIView("C")
  17. let D = UIView("D")
  18. let E = UIView("E")
  19.  
  20. let a = UIView("a")
  21. let b = UIView("b")
  22. let c = UIView("c")
  23. let d = UIView("d")
  24. let e = UIView("e")
  25.  
  26.  
  27. d.subViews.append(e)
  28. e.superView = d
  29.  
  30.  
  31. D.subViews.append(E)
  32. E.superView = D
  33.  
  34. a.subViews = [b,c,d]
  35. b.superView = a
  36. c.superView = a
  37. d.superView = a
  38.  
  39.  
  40. A.subViews = [B,C,D]
  41.  
  42. class viewIterator{
  43.    
  44.     var cur : UIView?
  45.    
  46.     init(_ rootView: UIView){
  47.         cur = rootView
  48.         moveChild()
  49.     }
  50.    
  51.     private func moveChild(){
  52.         guard let currV = cur else {
  53.             return
  54.         }
  55.         var runner = currV
  56.         while runner.subViews.count > 0 {
  57.             runner = runner.subViews[0]
  58.         }
  59.         cur = runner
  60.     }
  61.    
  62.     func hasNext() -> Bool{
  63.         return cur != nil
  64.     }
  65.     func next() -> UIView?{
  66.         guard let curView = cur else {
  67.             return nil
  68.         }
  69.         let ans = curView
  70.        
  71.         if let superv = curView.superView {
  72.             if let index = superv.subViews.firstIndex(where: { (view) -> Bool in
  73.                 view === cur
  74.             }){
  75.                 if index == superv.subViews.count - 1 {
  76.                     cur = superv
  77.                 }else{
  78.                     cur = superv.subViews[index + 1]
  79.                     moveChild()
  80.                 }
  81.             }
  82.         }else{
  83.             cur = nil
  84.         }
  85.         return ans
  86.     }
  87. }
  88.  
  89.  
  90.  
  91. let iterator = viewIterator(a)
  92.  
  93. print(iterator.hasNext())
  94. print(iterator.hasNext())
  95. print(iterator.hasNext())
  96. print(iterator.next()?.val)
  97. print(iterator.next()?.val)
  98. print(iterator.next()?.val)
  99. print(iterator.next()?.val)
  100. print(iterator.next()?.val)
  101. print(iterator.next()?.val)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement