iced

최근 수정 시각: ()
Iced
파일:iced logo.svg
개발자
hecrj
링크
파일:GitHub 아이콘 light.svg파일:GitHub 아이콘 dark.svg 파일:Docs.rs logo.png 파일:Crates.io logo.png
1. 개요2. 사용법
2.1. 비동기
3. 특징4. 사용하는 소프트웨어

1. 개요 [편집]

러스트의 GUI 프레임워크이다.

2. 사용법 [편집]

파일:iced 구조.svg
iced는 기본적으로 위의 구조를 갖고 있다. 먼저 UI에서 사용자가 상호작용하면 update 로직에 보낼 Message 열거를 만들어보자
enum Message {
    Hello,
    Bye
}

그리고 데이터를 담을 state 구조체를 만들자
#[derive(Default)]
struct State {
    say:String
}

say의 기본값을 "hello"로 지정해주고 싶으면 derive 메크로를 제거하고
impl Default for State {
    fn default() Self {
        Self {
            say:String::from("hello");
        }
    }
}
를 추가해주자.[1]
그리고 상호작용을 할 때 실행될 update 함수를 만들자
fn update(state:&mut State, message:Message) {
    match Message {
        Hello => {
            state.say = String::from("Hello");
        },
        Bye => {
            state.say = String::from("Bye");
        }
    }
}

마지막으로 UI를 담당할 view 함수를 만들고
use iced::Element;
use iced::widget::{button, column, text};

fn view(state: &State) -> Element<'_, Message> {
    column![
        text(state.say),
        button("say hello").on_press(Message::Hello),
        button("say bye").on_press(Message::Bye)
    ].into()
}

iced::run으로 실행하자
fn main () -> iced::Result {
    iced::run(update, view)?
}

2.1. 비동기 [편집]

update로직이 너무 오랫동안 실행되면 UI 전채가 멈춰지는 문제가 있다.[2] 그래서 내장 런타임을 활용하여 IO같은 지연이 오래걸리는 작업을 비동기로 처리해줘야한다.
fn update(state:&mut State, message:Message) -> iced::Task<Message> {
    match Message {
        Message::SomeAsyncTask => {
            return iced::Task::perform(asyncfunc(), Message::AfterAsyncTask);
            //asyncfunc라는 함수를 실행하고 함수 실행이 완료되면 AfterAsyncTask를 update의 message로 넘긴다는 뜻.
        }
        Message::AfterAsyncTask => {
            println!("비동기 작업 완료! ✌️");
            Task::none(); //비동기 작업을 실행하지 않는다는 뜻
        }
    }
}
async fn asyncfunc() {
    sleep(1000).await;
}

이런식으로 업데이트 함수를 수정해주면 된다.

3. 특징 [편집]

  • 마지막 릴리즈가 25년 9월 기준1년 전에 나왔다![3]
  • 비동기 처리를 자체 런타임을 이용해서 하는데 tokio[4] 런타임이랑 호환이 안되는듯 하다[5]

4. 사용하는 소프트웨어 [편집]

  • cosmic
[1] 사실 iced::application이라는 대응 함수도 있는데 부실한 문서화때문에 사용하기 어렵다[2] rust의 함수는 기본적으로 블로킹 방식이기 때문이다[3] cargo add iced 대신 깃헙 주소를 입력하는 것을 추천한다. 브랜치는 master로[4] 러스트에서 가장 많이쓰는 런타임[5] 따라서 hyper같은 프레임워크를 쓰려면 iced::main 메크로를 사용하였다는 가정 하에 tokio 런타임속 iced 런타임속 tokio 런타임을 만들어야 한다! 따라서 poise같은 hyper를 종속하는 프레임워크를 쓸 때는 고려해보자

라이선스를 별도로 명시하지 않은 문서는 CC BY-SA 4.0에 따라 이용할 수 있습니다.
자세한 내용은 다올위키 라이선스 정책을 확인하시기 바랍니다.

기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.

오픈 소스가 아닌 다올위키의 고유한 디자인을 무단으로 도용하는 것과, 운영 문서를 포함한 모든 문서를 라이선스를 지키지 않고 무단으로 가져가는 행동은 저작권 위반이며 법적 책임을 물 수 있습니다.