AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / 问题

Perguntas[swift](coding)

Martin Hope
HL666
Asked: 2025-04-30 06:55:21 +0800 CST

Comportamento estranho na verificação de metatipos Swift

  • 6

Estou brincando com a resposta desta questão: Como testar se uma variável genérica é do tipo AnyObject

Essa solução parece não funcionar mais. Tenho este código:

public struct ObjectHashable<T>: Hashable {
  
  public let object: T
  
  public init(object: T) {
    
    let t1 = type(of: object)
    let b1 = t1 is AnyClass
    print(t1) // Plugin
    print(b1) // false
    
    let t2 = T.self
    let b2 = t2 is AnyClass
    print(t2) // Plugin 
    print(b2) // false
    
    let t3 = Mirror(reflecting: object).subjectType 
    let b3 = t3 is AnyClass 
    print(t3) // P
    print(b3) // true 

    self.object = object
    
  }
  
  public static func ==(lhs: Self, rhs: Self) -> Bool {
    return true
  }
  
  public func hash(into hasher: inout Hasher) {
  }
}

protocol Plugin: AnyObject {}
class P: Plugin {}

typealias PluginHashable = ObjectHashable<Plugin>

PluginHashable(object: P())

Esse é um comportamento surpreendente.

1.

let t1 = type(of: object)

type(of:)deveria retornar o tipo dinâmico, que é P, não Plugin. Mas obtive "Plugin" impresso.

2.

let b1 = t1 is AnyClass

Não deveria ser verdade, já que t1 é um tipo de referência? (com base na resposta aqui: Como testar se uma variável genérica é do tipo AnyObject )

3.

let t2 = T.self

Isso imprime Plugin, o que faz sentido, porque eu Plugincoloquei<>

4.

let b2 = t2 is AnyClass

Isso é falso, mas acho que deveria ser verdade pelo mesmo motivo

5.

    let t3 = Mirror(reflecting: object).subjectType // P

Isso imprime P, o que faz sentido

6.

    let b3 = t3 is AnyClass // true

Isso é verdade, o que faz sentido. Mas por que é diferente dos outros dois casos?

swift
  • 1 respostas
  • 47 Views
Martin Hope
HL666
Asked: 2025-04-29 12:18:10 +0800 CST

Como fazer um wrapper de protocolo (não o protocolo em si) estar em conformidade com Hashable em Swift

  • 5

Tenho um protocolo que é restrito apenas a tipos de classe:

protocol Plugin: AnyObject {}

Agora, quero usar o plugin como chave do mapa de hash. Não quero que o Pluginprotocolo se estenda de Hashable, porque teria que escrever any Pluginem todos os lugares (já que ele herdaria "Auto-Requisito" do protocolo pai).

Então, para contornar isso, quero criar um wrapper genérico. Não quero usar AnyHashable, porque quero um tipo mais restrito em caso de erros.

public struct ObjectHashable<T: AnyObject>: Hashable {
  
  public let object: T
  
  public init(object: T) {
    self.object = object
  }
  
  public static func ==(lhs: Self, rhs: Self) -> Bool {
    return ObjectIdentifier(lhs.object) == ObjectIdentifier(rhs.object)
  }
  
  public func hash(into hasher: inout Hasher) {
    hasher.combine(ObjectIdentifier(object))
  }
}

Agora eu quero fazer algo como

typealias PluginHashable = ObjectHashable<Plugin>

No entanto, isso me dá erro:

requisito especificado como 'T': 'AnyObject' [com T = qualquer plugin]

Então eu mudei para

typealias PluginHashable = ObjectHashable<any Plugin>

E recebi o mesmo erro:

requisito especificado como 'T': 'AnyObject' [com T = qualquer plugin]

Pelo que entendi, embora Plugino protocolo seja limitado a ser um tipo de classe, any Pluginele não é. No entanto, não sei o que fazer a seguir.

Atualizar:

Se eu não usar o genérico for ObjectHashable, funciona:

public struct PluginHashable: Hashable {
  
  public let plugin: Plugin
  
  public init(plugin: Plugin) {
    self.plugin = plugin
  }
  
  public static func ==(lhs: Self, rhs: Self) -> Bool {
    return ObjectIdentifier(lhs.plugin) == ObjectIdentifier(rhs.plugin)
  }
  
  public func hash(into hasher: inout Hasher) {
    hasher.combine(ObjectIdentifier(plugin))
  }
}

No entanto, esta solução só é utilizável para Pluginprotocolo, portanto não é ideal. Prefiro ter uma solução que funcione para todos os casos semelhantes.

swift
  • 1 respostas
  • 49 Views
Martin Hope
cluster1
Asked: 2025-04-28 17:41:47 +0800 CST

Experimento Swift @MainActor: Como devo interpretar esse resultado?

  • 7

Tento me familiarizar com a simultaneidade do Swift, especialmente com o MainActor.

Eu criei para mim esta classe de demonstração :

@MainActor
class ThreadsDemo {
  let range1000 = 0.. < 1000
  var randomNumber = 0

  init() {
    randomNumber = Int.random(in: range1000)
  }

  func modifyRandomNumber() async {
    print("2. isMain: \(Thread.isMainThread)")
    let newRandomNumber = Int.random(in: range1000)
    print("Generated random-number -> \(newRandomNumber)")
    Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false) {
      _ in
        print("4. isMain (within wait): \(Thread.isMainThread)")
    }
    print("5. isMain: \(Thread.isMainThread)")
    randomNumber = newRandomNumber
  }
}

Invocando o método ThreadDemo:

.task {
  print("1. isMain: \(Thread.isMainThread)")
  print("Initial random-number -> \(threadsDemo.randomNumber)")
  await threadsDemo.modifyRandomNumber()
  print("Modified random-number -> \(threadsDemo.randomNumber)")
  print("6. isMain: \(Thread.isMainThread)")
}

Resultado:

1. isMain: true
Initial random-number -> 455
2. isMain: true
Generated random-number -> 578
5. isMain: true
Modified random-number -> 578
6. isMain: true
4. isMain (within wait): true

Obviamente executa tudo no thread principal, até mesmo o bloco dentro do temporizador agendado.

Estou confuso, porque pensei que ele usaria threads em segundo plano para evitar que a interface do usuário travasse e parasse de responder.

Se ele executa tudo no thread principal de qualquer maneira, então qual é o propósito de usar tarefas?

Mas o que eu realmente tentei descobrir:

A anotação @MainActor resulta na execução de tudo no thread principal (todo o código executável) ou resulta apenas em fazer alterações no estado (atribuições, etc.), sempre no thread principal?

swift
  • 2 respostas
  • 59 Views
Martin Hope
ATL_DEV
Asked: 2025-04-25 07:20:01 +0800 CST

Comparar um elemento de array com um valor gera um erro

  • 5

Não tenho certeza do que estou fazendo errado, mas quando executo o código abaixo:

func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
    let length = nums.count-1;

    for index1 in 0...length {
        let difference = target - nums[index1];
        print(target, difference, nums[index1])
        if (nums[index1] < difference) {
            for index2 in index1+1...length {
                if (nums[index2] == difference) {
                    return [index1, index2];
                }
            }
        }
    } 

    return [];
}

let summer = twoSum([-1,-2,-3,-4,-5], -8)

Recebo o seguinte erro:

Swift/ClosedRange.swift:347: Erro fatal: O intervalo requer lowerBound <= upperBound

Curiosamente, se eu alterar a condição da instrução if para nums[index1] <= target, ela não trava.

swift
  • 2 respostas
  • 69 Views
Martin Hope
CalebK
Asked: 2025-04-24 15:35:25 +0800 CST

Existe uma maneira de dar ao aplicativo um quadro mínimo sem definir o quadro mínimo do conteúdo?

  • 6

Este aplicativo de exemplo, quando executado no macOS 15.4, exibe um comportamento de animação estranho ao abrir e fechar a barra lateral.

Tudo o que você precisa fazer para corrigir o problema é remover a .frame(minWidth: 805, minHeight: 525)linha, mas isso significa que você não pode limitar o tamanho da janela.

Gostaria de ter um tamanho mínimo para meu aplicativo, mas isso defaultSize()não funciona.

enum Page: String, Hashable {
    case settings = "Settings"
    case radio = "Radio"
    case connect = "Connect"
    
    var systemImageName: String {
        switch self {
        case .settings:
            return "gear"
        case .radio:
            return "radio"
        case .connect:
            return "dot.radiowaves.right"
        }
    }
}

struct ContentView: View {
    @State var pages = [Page.settings, Page.radio, Page.connect]
    
    var body: some View {
        NavigationSplitView {
            List(pages, id: \.self) { page in
                Label(page.rawValue.capitalized, systemImage: page.systemImageName)
            }
        } detail: {
            Text("Content")
        }
    }
}

@main
struct NavigationTestsApp: App {
    var body: some Scene {
        Window("Navigation", id: "H") {
            Group {
                ContentView()
                    // Without this line this animation bug does not happen
                    .frame(minWidth: 805, minHeight: 525)
            }
        }
    }
}

Vídeo do bug

swift
  • 1 respostas
  • 65 Views
Martin Hope
Youmate
Asked: 2025-04-24 07:56:48 +0800 CST

A propriedade 'logs' isolada do ator não pode ser referenciada a partir de um contexto não isolado

  • 6

Estou tentando aprender Swift 6. O problema que tenho enfrentado é que não consigo ler (não tentar modificar) as propriedades de actorum UI class.

É possível ler sem adicionar propriedades armazenadas extras ou aguardar?

Você pode me dar alguma solução para isso?

final actor Logger: Sendable {
    
    static let current = Logger()
    
    private(set) final var logs: [Int] = []
    
    private init() { }
    
    nonisolated var count: Int {
        
        return self.logs.count
    }
}

final class ViewController: NSViewController, NSTableViewDataSource {
   
    @IBOutlet weak var tableView: NSTableView!
     
    func numberOfRows(in tableView: NSTableView) -> Int {
        
        return Logger.current.count
    }
}

Erro:

A propriedade 'logs' isolada do ator não pode ser referenciada a partir de um contexto não isolado

Obrigado!

swift
  • 1 respostas
  • 45 Views
Martin Hope
User95797654974
Asked: 2025-04-20 19:35:00 +0800 CST

Por que o loop sobre os índices de uma matriz em ForEach prejudica o desempenho da rolagem?

  • 8

Tenho uma grande variedade de cerca de 50 mil itens, onde cada item está em conformidade com a identificação.

Eu não altero o conjunto de nenhuma forma, nem reorganizo nem nada.

Se eu passasse diretamente para ForEach, o desempenho de rolagem da lista seria significativamente mais suave do que se eu passasse os índices.

Percebo que a documentação menciona algo relacionado à identidade estrutural de cada célula, mas não consigo entender por que isso acontece.

ForEach(myArray, id: \.id) { item in
    MyRowView(item: item)
}

// Extremely choppy scroll
ForEach(myArray.indices, id: \.self) { index in
    MyRowView(item: myArray[index])
}
swift
  • 1 respostas
  • 94 Views
Martin Hope
Wahab Khan Jadon
Asked: 2025-04-20 10:55:09 +0800 CST

SwiftUI @Environment com @Binding não funciona como esperado – $myBool causa erro, mas _myBool.wrappedValue funciona

  • 5

Estou tentando passar um valor @Binding para a hierarquia de visualizações do SwiftUI usando uma @EnvironmentKey personalizada. Na minha NestedView, estou usando uma combinação de @Environment e @Binding como esta:

@Environment(\.featureEnabledBinding) @Binding var myBool: Bool

Eu deveria conseguir usar isso em um Toggle como: Toggle(isOn: $myBool, label: { Text("Toggle") })

Entretanto, isso me dá um erro do compilador:

Não é possível encontrar '$myBool' no escopo

isso funciona perfeitamente: Toggle(isOn: _myBool.wrappedValue, label: { Text("Toggle") })

Isso é o oposto do que eu esperava. Pelo que entendi: • _myBool deve ser o wrapper (Binding) • $myBool deve ser o valor projetado (também um Binding)

Aqui está meu código

Configuração do ambiente:

struct FeatureEnabledKey: EnvironmentKey {
    static let defaultValue: Binding<Bool> = .constant(false)
}

extension EnvironmentValues {
    var featureEnabledBinding: Binding<Bool> {
        get { self[FeatureEnabledKey.self] }
        set { self[FeatureEnabledKey.self] = newValue }
    }
}

e Exemplo Mínimo

struct ParentView: View {
    @State private var isFeatureEnabled = false

    var body: some View {
        NestedView()
            .environment(\.featureEnabledBinding, $isFeatureEnabled)
    }
}

struct NestedView: View {
    @Environment(\.featureEnabledBinding) @Binding var myBool: Bool

    var body: some View {
        VStack {
            // ❌ This gives an error : Cannot find '$myBool' in scope
            // Toggle(isOn: $myBool, label: { Text("Toggle") })

            // ✅ This works fine
            Toggle("Working Toggle", isOn: _myBool.wrappedValue)
        }
    }
}

Pergunta: Por que $myBool está indisponível ou inválido neste contexto? É um bug conhecido do SwiftUI/compilador com wrappers de propriedade dupla (@Environment @Binding)? Ou meu entendimento não está correto.

Xcode: 16.3

swift
  • 1 respostas
  • 58 Views
Martin Hope
Serhii R
Asked: 2025-04-15 22:00:07 +0800 CST

Ação "Voltar" automática após seleção de item da lista no NavigationLink

  • 5

Tenho uma tela no aplicativo iOS com NavigationStack (ou NavigationView) que contém diferentes elementos. Um deles é a Lista pesquisável, que está encapsulada no NavigationLink. Portanto, essa lista pesquisável aparece em uma nova tela.

E quando o usuário seleciona algum elemento da Lista, ele deve retornar automaticamente à tela anterior sem dois cliques adicionais nos botões Cancelar (se usar a pesquisa) e depois "Voltar".

Existe alguma maneira certa de fazer isso? Obrigado por qualquer conselho!

import SwiftUI

struct TheItem: Identifiable {
    let id = UUID()
    let name: String
}

class SomeModel: ObservableObject {
    
    @Published var selectedId: UUID?
    @Published var searchText: String = ""

    var items: [TheItem] = [
        TheItem(name:"Item 1"),
        TheItem(name:"Item 2"),
        TheItem(name:"Item 3"),
        // ...
        TheItem(name:"Item N")
    ]
    
    var filteredItems: [TheItem] {
        guard !searchText.isEmpty else { return self.items }
        return self.items.filter { item in
            item.name.lowercased().contains(self.searchText.lowercased())
        }
    }
    
    var selectedItemName: String {
        if selectedId != nil {
            return filteredItems.first(where: {$0.id == selectedId})?.name ?? "-"
        }
        return "-"
    }
    
    init () {
        selectedId = items.first?.id
    }
}

struct TestNavigationLinkBackkView: View {
    
    @EnvironmentObject private var model: SomeModel
    
    var body: some View {
        NavigationStack {
            NavigationLink(model.selectedItemName) {
                List {
                    Picker("Item", selection: $model.selectedId) {
                        ForEach(model.filteredItems) { item in
                            Text(item.name).tag(item.id)
                        }
                    }
                }
                .searchable(text: $model.searchText, placement: .navigationBarDrawer(displayMode: .always))
                .pickerStyle(.inline)
            }
        }
    }
}

#Preview {
    TestNavigationLinkBackkView()
        .environmentObject(SomeModel())
}
swift
  • 1 respostas
  • 27 Views
Martin Hope
CalebK
Asked: 2025-04-10 05:35:15 +0800 CST

É aceitável tornar uma entidade CoreData identificável?

  • 4

Sou novo no CoreData, mas criei um objeto que pretendo usar como uma matriz dentro de um loop ForEach no SwiftUI.

No editor de entidades, adicionei um atributo UUID stored_id. Em seguida, em uma extensão, escrevi isto:

extension Item: Identifiable {
    public var id: UUID {
        guard let stored_id else {
            assertionFailure("No stored ID")
            return UUID()
        }
        return stored_id
    }
    
}

Isso me parece bastante estranho por vários motivos, como o fato de stored_id ser opcional dada a semântica do CoreDatas. Será que isso é uma prática ruim por algum motivo?

swift
  • 1 respostas
  • 16 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve