2017-10-13 2 views
0

S'il vous plaît ne marquez pas la question répétitive.SecIdentity + Force Cast Violation: les lancers de force doivent être évités. (force_cast)

Salut à tous,

que je fais NSURLAuthenticationMethodClientCertificate où je suis en utilisant le code suivant. Dans quel code est bon si je n'utilise pas swiftlint. Mais quand j'utilise swiftlint, je reçois cette erreur et je n'arrive pas à résoudre ce problème. J'ai beaucoup essayé, aidez-moi s'il vous plaît. Poster le code ci-dessous.

var items: CFArray? 
    //let PKCS12Data = DataSourceManager.sharedInstance.serverPolicyManager?.PKCS12Data 
    securityError = SecPKCS12Import(certData, options, &items) 

    if securityError == errSecSuccess { 
     let certItems: CFArray = items as CFArray! 
     let certItemsArray: Array = certItems as Array 
     let dict: AnyObject? = certItemsArray.first 
     if let certEntry: Dictionary = dict as? Dictionary<String, AnyObject> { 

      // grab the identity 
      let identityPointer = certEntry["identity"] 
      let secIdentityRef = identityPointer as! SecIdentity 
      print("\(String(describing: identityPointer)) :::: \(secIdentityRef)") 
      // grab the trust 
      let trustPointer: AnyObject? = certEntry["trust"] 
      let trustRef: SecTrust? = trustPointer as! SecTrust 
      print("\(String(describing: trustPointer)) :::: \(trustRef)") 
      // grab the cert 
      let chainPointer: AnyObject? = certEntry["chain"] 
      identityAndTrust = IdentityAndTrust(identityRef: secIdentityRef, trust: trustRef!, certArray: chainPointer!) 

     } 

    } 

Je reçois une violation forcée dans les lignes ci-dessous.

let secIdentityRef = identityPointer as! SecIdentity

let trustRef: SecTrust? = trustPointer as! SecTrust

Répondre

1

Fondamentalement, ce que vous faites est une force baissés, ce qui signifie que vous garantissez que la vôtre identityPointer et trustPointer sont des objets de SecIdentity et SecTrust respectivement des classes. Mais que se passe-t-il s'ils ne le sont pas? Vous les sortez du dictionnaire AnyObject, donc généralement ils ne peuvent pas lancer aux classes cibles. Swiftlint vous dit que le lancer de force est une mauvaise pratique et veut que vous l'évitiez.

Cependant, il semble qu'avec le type CoreFoundation, vous ne pouvez pas utiliser un cast conditionnel as?, donc le cast forcé est votre seul choix. Dans ce cas particulier, vous pouvez désactiver la règle Swiftlint dans le code en ajoutant un commentaire spécial.

let secIdentityRef = identityPointer as! SecIdentity // swiftlint:disable:this force_cast 

Pour être du bon côté, vous aussi peut vérifier l'identité de l'objet en vérifiant la base Foundation « Type id »:

guard let identityPointer = certEntry["identity"], 
    CFGetTypeID(identityPointer) == SecIdentityGetTypeID() else { 
    // here you know that the cast will fail 
} 
let secIdentityRef = identityPointer as! SecIdentity // swiftlint:disable:this force_cast 
+0

J'ai essayé de cette façon avec garde dans ce cas " Downcast conditionnel au type CoreFoundation 'SecIdentity' réussira toujours "L'erreur apparaît. J'ai essayé de plusieurs façons, mais ma compréhension est incapable de taper les objets de fonderie Cast. –

+0

Pour être honnête, je ne savais pas qu'il s'agissait d'objets CoreFoundation. Fait quelques recherches et mis à jour la réponse! – swasta

+0

pourriez-vous s'il vous plaît mettre à jour réponse si vous savez comment résoudre ce –