Estou tentando criar um aplicativo universal para iPhone, mas ele usa uma classe definida apenas em uma versão mais recente do SDK. A estrutura existe em sistemas mais antigos, mas uma classe definida na estrutura não.
Eu sei que quero usar algum tipo de link fraco, mas qualquer documentação que eu possa encontrar fala sobre verificações de tempo de execução para a existência de funções - como faço para verificar se uma classe existe?
ios
backwards-compatibility
weak-linking
psicótico
fonte
fonte
Respostas:
TLDR
Atual:
if #available(iOS 9, *)
if (@available(iOS 11.0, *))
if (NSClassFromString(@"UIAlertController"))
Legado:
if objc_getClass("UIAlertController")
if (NSClassFromString(@"UIAlertController"))
if ([UIAlertController class])
Swift 2+
Embora historicamente seja recomendado verificar os recursos (ou existência de classe) em vez de versões específicas do sistema operacional, isso não funciona bem no Swift 2.0 por causa da introdução da verificação de disponibilidade .
Use desta forma:
Observação: se você tentar usar
objc_getClass()
, receberá o seguinte erro:Versões anteriores de Swift
Observe que
objc_getClass()
é mais confiável do queNSClassFromString()
ouobjc_lookUpClass()
.Objective-C, iOS 4.2+
Veja a resposta do code007 para mais detalhes .
OS X ou versões anteriores do iOS
Use
NSClassFromString()
. Se retornarnil
, a classe não existe, caso contrário, ele retornará o objeto de classe que pode ser usado.Esta é a forma recomendada de acordo com a Apple neste documento :
fonte
Class
instância retornada porNSClassFromString
(atribua aid
) e invoca os seletores nessa instância.canImport
. PropostaPara novos projetos que usam um SDK base do iOS 4.2 ou posterior, há esta nova abordagem recomendada que é usar o método de classe NSObject para verificar a disponibilidade de classes fracamente vinculadas em tempo de execução. ie
fonte: https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW3
Este mecanismo usa a macro NS_CLASS_AVAILABLE, que está disponível para a maioria dos frameworks no iOS (observe que pode haver alguns frameworks que ainda não suportam NS_CLASS_AVAILABLE - verifique a nota de lançamento do iOS para isso). Também pode ser necessária uma configuração de configuração extra, que pode ser lida no link de documentação da Apple fornecido acima; no entanto, a vantagem desse método é que você obtém verificação de tipo estático.
fonte
UIAlertController
embora ainda suporte iOS 7. A resposta do code007 está correta, mas a configuração extra necessária é vincular fracamente (definir deRequired
paraOptional
) UIKit em seu projeto (para esta situação, pelo menos).