Level : 13,720 WORDPRESS BOOK LINKEDIN PATENT Send Mail 동냥하기 윤지오

Digital Nomad

class FilledRect : UIView {

    

    init(frame: CGRect, level: CGFloat, color: UIColor) {

        //        super.init(frame: frame)

        super.init(frame: CGRect(x: 0, y: 0, width: 1, height: 0)) //TODO: HAVE

        self.layer.borderWidth = 1.0

        let levelLayer = CAShapeLayer()

        levelLayer.path = UIBezierPath(roundedRect: CGRect(x: frame.origin.x,

                                                           y: frame.origin.y,

                                                           width: frame.width * level,

                                                           height: frame.height),

                                       cornerRadius: 0).cgPath

        levelLayer.fillColor = color.cgColor

        self.layer.addSublayer(levelLayer)

    }

    

    required init?(coder aDecoder: NSCoder) {

        fatalError("Required, but Will not be called in a Playground")

    }

}


이런거 쓸 때,


좌표를 더해서 붙여줘야 한다.


이런 식으로...

        var view1 : UIView = FilledRect(frame: CGRect(x: 0, y: 0, width: 10, height: CGFloat(ph*ratio)), level: 1, color :  colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1))

        var view2 : UIView = FilledRect(frame: CGRect(x: 0, y: 0, width: 10, height: CGFloat(ph*ratio) + CGFloat(pn*ratio)), level: 1, color :  colorLiteral(red: 0.1764705926, green: 0.01176470611, blue: 0.5607843399, alpha: 1))

        var view3 : UIView = FilledRect(frame: CGRect(x: 0, y: 0, width: 10, height: CGFloat(pl*ratio) + CGFloat(ph*ratio) + CGFloat(pn*ratio)), level: 1, color :  colorLiteral(red: 0.521568656, green: 0.1098039225, blue: 0.05098039284, alpha: 1))


이 딴거 안통함.

   imgView1.addSubview(imgBasal)

        imgView1.snp.makeConstraints{

            $0.left.equalToSuperview()

            $0.top.equalToSuperview()

        }

        

        imgView11.addSubview(imgBasal1)

        imgView11.snp.makeConstraints{

            $0.left.equalToSuperview()

            $0.top.equalTo(imgView1.snp.bottom)

        }

        


Comment +0

 var backgroundPanel = UIView()

        

        

        backgroundPanel.backgroundColor = UIColor(red: 33, green: 33, blue: 23, alpha: 1.0)

        

        self.viewArea.addSubview(backgroundPanel)


이런 애들이 반복되면


    lazy var backgroundPanel : [UIView] = {

        let sample = UIView()

        sample.backgroundColor =  colorLiteral(red: 0.2549019754, green: 0.2745098174, blue: 0.3019607961, alpha: 1)

        let ret : [UIView] = Array(repeating: sample, count: 3)

        return ret

    }()


        backgroundPanel[0].snp.makeConstraints {

            $0.width.equalTo(280)

            $0.height.equalTo(44)

            $0.top.equalToSuperview().offset(GS.s.tendency_3dots_popup_lbltxt_topMargin)

            $0.left.equalToSuperview().offset(GS.s.tendency_3dots_popup_label_leftMargin)

        }


       backgroundPanel[1].snp.makeConstraints {

            $0.width.equalTo(350)

            $0.height.equalTo(44)

            $0.top.equalTo(lblLowestCGM.snp.bottom).offset(GS.s.tendency_3dots_popup_lbltxt_topMargin)

            $0.left.equalToSuperview().offset(GS.s.tendency_3dots_popup_label_leftMargin)

        }


        backgroundPanel[2].snp.makeConstraints {

            $0.width.equalTo(300)

            $0.height.equalTo(44)

            $0.top.equalTo(lblAvgSG.snp.bottom).offset(GS.s.tendency_3dots_popup_lbltxt_topMargin)

            $0.left.equalToSuperview().offset(GS.s.tendency_3dots_popup_label_leftMargin)

        }



이렇게 만들어 보고 싶을 것이다. 그러나 sample 은 하나의 객체이므로 

        var sample1 = UIView()

        sample1.backgroundColor =  colorLiteral(red: 0.2549019754, green: 0.2745098174, blue: 0.3019607961, alpha: 1)

        var sample2 = UIView()

        sample2.backgroundColor =  colorLiteral(red: 0.2549019754, green: 0.2745098174, blue: 0.3019607961, alpha: 1)

        var sample3 = UIView()

        sample3.backgroundColor =  colorLiteral(red: 0.2549019754, green: 0.2745098174, blue: 0.3019607961, alpha: 1)

        let ret : [UIView] = [sample1, sample2, sample3]


와 같이 다른 객체로 넘겨 주어야 한다. 코드를 줄이면, 


        let ret : [UIView] = [UIView(), UIView(), UIView()]

        for men in ret {

            men.backgroundColor =  colorLiteral(red: 0.2549019754, green: 0.2745098174, blue: 0.3019607961, alpha: 1)

        }

겠지.






Comment +0

+ 원리, 그래픽 소스까지 넣으면 복잡.

클로저는 간단하다.


import UIKit


func textT(_ first : ()-> (), _ second : ()-> ()) {

    first()

    second()

}


textT( { print("first") }, { print("second") })




보통 클로저는 하나만 쓰기 때문에 ()를 닫아 버리고 {} 로 대체 가능하다.


import UIKit


func textT(_ first : ()-> (), _ second : ()-> ()) {

    first()

    second()

}


textT( { print("first") }) { print("second") }


class ViewController: UIViewController {

    

    func textT(_ first : ()-> (), _ second : ()-> ()) {

        first()

        second()

    }

    

    override func viewDidLoad() {

        textT( { print("first") }) { print("second") }

    }

}

REST API를 쓴다면 필시 Alamofire를 이용하리라 생각된다.

클로저를 이용하면, DispatchQueue를 이용하지 않고 동기화를 할 수 있다.


make func getJSON() to func getJSON(_ whatUwant2execute : @escaping () -> () )


and use your function


getJSON { ... codes ... }


and choose the location you want to execute in Alamofire


getJSON(_ whatUwant2execute : @escaping () -> () ) { Alamofire.request(.GET, "http://announcement.vassy.net/api/AnnouncementAPI/Get/").responseJSON {

 (Response) -> Void in     // checking if result has value    

   if let value = Response.result.value {         

    let json = JSON(value)         

    whatUwant2execute()        

    .        

    .        

    .

then ... codes ... will be executed on that point.


결국 클로저는 함수 포인터고 함수를 실행할 때 쓰는 ()를 이용해서 트리거 시킨다가 요점.


내가 말하고 싶은 더블 클로저는 파라미터 2개인 클로저가 아니라 2차 포인터 처럼 클로저 안에 클로저를 말한다. 포인터를 C의 함수 포인터로 이해하면 쉽지만 이론 설명은 생략. 바로 코드로... 위 소스에서 두번째 클로저는 지웠다. 이름을 바꾸고 클로저 안에 클로저를 넣으면 된다. 흔적 따라오라며 다 바꾸진 않음


import UIKit


func progressBar(_ first : ((Int)->())-> ()) {

    first() { (s) in

        print(s, " %")

    }

}


progressBar() { (closure) -> () in

    print("hello msg")

    closure(10)

    print("checking new version of software")

    closure(20)

    print("connect to the updating server")

    closure(50)

    print("download loop")

    closure(100)

}


핵심은 progress를 담고 있는 var 를 없애는 함수형 프로그래밍을 한다는데 있다. 내가 생각하는 함수형 프로그래밍은 메모리를 삭제 과정 없이 계속 리니어하게 써서 속도를 향상 시키는데 있다고 믿지만, 어느 순간 변질 된 듯. 리눅스 커널 분석하며 어려운 함수 포인터를 typedef 로 무한적 래핑할 수 있는 제자들은 이해가 쉬울 듯.


트리블 클로저를 이용하면 updating 되고 있는 프로그레스바를 더욱 스무스하게 만들 수 있다.


하드웨어 발전 속도만 믿고 뱅글 뱅글 도는 기다림표로 점철되어진 안타까운 소프트웨어에 활력을!


그리고 팁...


FYI,

Plz remember () is used 2 ways "make something in memory" or "executing"

In swift world {} is the meaning of one of the (), executing.

This is the reason why you don't need to write like a below

getJSON ({ ... codes ... })

and {} is the meaning of the definition of functions body.

Both () and {} have two meanings we have to know.

망할 스택 오버플로우에 앞으로 답변하나 봐라. 대한민국 프로그래머 만세


Comment +0

var ie7 = 0;