OpenSwiftui
OpenSwiftlui é uma implementação do OpenSource do Swifttu DSL da Apple (linguagem específica de domínio).
O objetivo do projeto é ficar perto da API original possível.
Atualmente, este projeto está em desenvolvimento inicial.
Fundo
A Apple introduziu o SwiftUi na WWDC 19. Desde então, o desenvolvimento de aplicativos com interfaces gráficas de usuários tornou -se mais confortável de ler, escrever e manter. Infelizmente, o princípio "Aprenda uma vez, aplique em qualquer lugar" funciona apenas em plataformas da Apple.
O Swift é executado em plataformas da Apple, na Web, Linux, Windows e até em dispositivos incorporados. Não seria ótimo se você pudesse escrever aplicativos baseados em GUI com SwiftUi em plataformas que correm Swift?
Swiftui em sua plataforma
O OpenSwiftlui fornece a API - outros projetos podem implementar a renderização real de elementos da interface do usuário para diferentes plataformas como Linux, Windows, Incorsed e muito mais.
Swiftuiembedded é um dos primeiros projetos que fazem uso do OpenSwiftlui (Demo).
Contribuindo
Com o tempo e adivinhação coletiva, deve ser possível recriar a API completa do Swiftui da Apple. Verifique a visão geral do status para ver o que está faltando ou precisa ser concluído.
Um bom ponto de partida é se familiarizar com a interface Swiftui, concentrar-se em certas funcionalidades e tentar implementá-la novamente. Uma ferramenta útil é usar a reflexão ( Mirror(reflecting: …) ) para espiar os tipos e instâncias swifttui. Isso revela a estrutura interna das instâncias (propriedades, tipos, nomes e herança).
Depois de implementar uma peça ausente, sinta -se à vontade para contribuir com uma solicitação de tração.
Observe:
Os métodos e propriedades privados de Swiftui devem ser prefixados por um _ (sublinhado) e marcado como público em OpenSwiftlui. Fazer isso é necessário porque o front -end pode precisar de acesso.
Xcode 11.2 ou superior é necessário.
Status
Visualizações e controles
Itens essenciais
| Status | Nome | Notas |
|---|
| ✅ | protocol View | |
Texto
| Status | Nome | Notas |
|---|
| ✅ | struct Text | |
| struct TextField | |
| struct SecureField | |
| ✅ | struct Font | |
Imagens
| Status | Nome | Notas |
|---|
| ️ | struct Image | CGIMAGE não suportado |
Botões
| Status | Nome | Notas |
|---|
| ✅ | struct Button | |
| struct NavigationLink | |
| struct MenuButton | |
| struct EditButton | |
| struct PasteButton | |
Seletores de valor
| Status | Nome | Notas |
|---|
| struct Toggle | |
| ️ | struct Picker | |
| struct DatePicker | |
| struct Slider | |
| ️ | struct Stepper | |
Tipos de suporte
| Status | Nome | Notas |
|---|
| ✅ | struct ViewBuilder | |
| ✅ | protocol ViewModifier | |
Ver layout e apresentação
Pilhas
| Status | Nome | Notas |
|---|
| ✅ | struct HStack | |
| ✅ | struct VStack | |
| ✅ | struct ZStack | |
Listas e visualizações de rolagem
| Status | Nome | Notas |
|---|
| struct List | |
| protocol DynamicViewContent | |
| ✅ | protocol Identifiable | Fornecido por Swift. |
| ✅ | struct ForEach | |
| struct ScrollView | |
| ️ | enum Axis | |
Visualizações de contêiner
| Status | Nome | Notas |
|---|
| struct Form | |
| ️ | struct Group | |
| struct GroupBox | |
| struct Section | |
Espaçador e divisores
| Status | Nome | Notas |
|---|
| ✅ | struct Spacer | |
| ✅ | struct Divider | |
Visões arquitetônicas
| Status | Nome | Notas |
|---|
| struct NavigationView | |
| struct TabView | |
| struct HSplitView | |
| struct VSplitView | |
Apresentações
| Status | Nome | Notas |
|---|
| struct Alert | |
| struct ActionSheet | |
Itens condicionalmente visíveis
| Status | Nome | Notas |
|---|
| ✅ | struct EmptyView | |
| struct EquatableView | |
Vistas com pouca frequência
| Status | Nome | Notas |
|---|
| ️ | struct AnyView | init?(_fromValue value: Any) ausente. |
| ✅ | struct TupleView | |
Desenho e animação
Itens essenciais
| Status | Nome | Notas |
|---|
| ️ | protocol Shape | |
Animação
| Status | Nome | Notas |
|---|
| struct Animation | |
| protocol Animatable | |
| protocol AnimatableModifier | |
| func withAnimation<Result>(Animation?, () -> Result) -> Result | |
| struct AnimationPair | |
| struct EmptyAnimationData | |
| struct AnyTransition | |
Formas
| Status | Nome | Notas |
|---|
| ️ | struct Rectangle | |
| ✅ | enum Edge | |
| struct RoundedRectangle | |
| ️ | struct Circle | |
| struct Ellipse | |
| struct Capsule | |
| struct Path | |
Formas transformadas
| Status | Nome | Notas |
|---|
| protocol InsettableShape | |
| struct ScaledShape | |
| struct RotatedShape | |
| struct OffsetShape | |
| struct TransformedShape | |
Tintas, estilos e gradientes
| Status | Nome | Notas |
|---|
| ✅ | struct Color | |
| struct ImagePaint | |
| struct Gradient | |
| struct LinearGradient | |
| struct AngularGradient | |
| struct RadialGradient | |
| struct ForegroundStyle | |
| struct FillStyle | |
| protocol ShapeStyle | |
| enum RoundedCornerStyle | |
| struct SelectionShapeStyle | |
| struct SeparatorShapeStyle | |
| struct StrokeStyle | |
Geometria
| Status | Nome | Notas |
|---|
| struct GeometryProxy | |
| struct GeometryReader | |
| protocol GeometryEffect | |
| struct Angle | |
| struct Anchor | |
| struct UnitPoint | |
| enum CoordinateSpace | |
| struct ProjectionTransform | |
| protocol VectorArithmetic | |
Estado e fluxo de dados
Ligações
| Status | Nome | Notas |
|---|
| ️ | struct Binding | |
Visualizações dependentes de dados
| Status | Nome | Notas |
|---|
| ✅ | struct State | |
| struct ObservedObject | |
| struct EnvironmentObject | |
| struct FetchRequest | |
| struct FetchedResults | |
| ️ | protocol DynamicProperty | func update() ausente. |
Valores ambientais
| Status | Nome | Notas |
|---|
| ✅ | struct Environment | |
| ✅ | struct EnvironmentValues | |
Preferências
| Status | Nome | Notas |
|---|
| protocol PreferenceKey | |
| struct LocalizedStringKey | |
Transações
| Status | Nome | Notas |
|---|
| struct Transaction | |
Gestos
Gestos básicos
| Status | Nome | Notas |
|---|
| struct TapGesture | |
| struct LongPressGesture | |
| struct DragGesture | |
| struct MagnificationGesture | |
| struct RotationGesture | |
Gestos combinados
| Status | Nome | Notas |
|---|
| struct SequenceGesture | |
| struct SimultaneousGesture | |
| struct ExclusiveGesture | |
Gesto personalizado
| Status | Nome | Notas |
|---|
| protocol Gesture | |
| struct AnyGesture | |
Propriedades de visão dinâmica
| Status | Nome | Notas |
|---|
| struct GestureState | |
| struct GestureStateGesture | |
Suporte de gestos
| Status | Nome | Notas |
|---|
| struct GestureMask | |
| struct EventModifiers | |
Lenda
| Símbolo | Descrição |
|---|
| ✅ | Feito |
| Abrir |
| ️ | Incompleto |
Recursos
Interface Swiftui
Comparado ao que você pode ver no Xcode, esta GIST mostra mais do que apenas as interfaces públicas. Ele mostra propriedades privadas e o corpo de propriedades, funções e inicializadores marcados @inlinable .
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/SwiftUI.framework/Versions/A/Modules/SwiftUI.swiftmodule/x86_64.swiftinterface
Swiftwebui
Swiftwebui é uma implementação de Swiftui para a Web por Helge Heß. O objetivo deste projeto é focado exclusivamente na web. Ele se desvia um pouco de Swiftui, pegando alguns atalhos aqui e ali - mas parece bastante completo em funcionalidade e é ótimo para inspiração.
Símbolos Swiftui
Este comando imprime a tabela de símbolos de SwiftUi através do utilitário llvm-mn .
nm -gUj /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/SwiftUI.framework/SwiftUI | swift-demangle | sed ' s/SwiftUI.//g ' | sed ' s/Swift.//g '
Você também pode dar uma olhada nessa essência.
Links
- O resultado do Swiftui @ViewBuilder é uma tupleview, como a Apple está usando -o e pode evitar transformar as coisas em AnyView?
- https://stackoverflow.com/questions/56434549/what-enables-swiftuis-dsl
- Construindo vistas personalizadas com swifttui
- Swiftui Essentials
- Fluxo de dados através de SwiftUi
- Apresentando SwiftUi: Construindo seu primeiro aplicativo
- Swiftui em todos os dispositivos
Obrigado especial
Eu quero agradecer especial a Helge Heß. Ele criou Swiftwebui, contribuiu com muitas sugestões para o OpenSwiftui e ajudou com as idéias de suas descobertas.
Contato
- Devran "Cosmo" Uenal
- Twitter: @MacCosmo
- LinkedIn: devranuenal
Licença
OpenSwiftui é liberado sob a licença do MIT.