2016-04-26 1 views
-1

J'utilise la classe suivante et il a une méthode pour extraire tous les emails à l'intérieur d'une chaîne, je suis nouveau à swift et c'est en me donnant une erreur. Quelqu'un peut-il expliquer s'il vous plaît pourquoi cette erreur arrive ..? Merci"Paramètre générique" L'élément "Impossible de déduire" une erreur dans swift ...?

import UIKit 
import Foundation 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 

     if let results = extractEmailFromString("[email protected] heyyyyy cool [email protected]") { 
      print(results) 
     } 
    } 

    func extractEmailFromString(string:NSString) -> [String]? { 
     let pattern = "(\\+[a-zA-Z0-9._-][email protected][a-zA-Z0-9._-]+\\.[a-zA-Z0-9._-]+)" 


     let regexp = try! NSRegularExpression(pattern: pattern, 
               options: [.CaseInsensitive]) 


     var results = [String]() 
     regexp.enumerateMatchesInString(string as String, options: NSMatchingOptions(rawValue: 0), range: NSRange(location: 0, length:string.length), usingBlock: { (result: NSTextCheckingResult!, _, _) in 
      results.append(string.substringWithRange(result.range)) 
     }) 

     return results 
    } 
} 

enter image description here

+1

Quelle est la question? – matt

+0

@matt Désolé la question a été perdu en soumettant, j'ai édité la question. –

Répondre

1

Ainsi, votre bloc demande un NSTextCheckingResult!, mais la signature d'un NSTextCheckingResult? attend. Si vous modifiez le bloc à usingBlock: { (result: NSTextCheckingResult?, _, _) in, cela rend le compilateur silencieux.

Je ne sais pas pourquoi le compilateur donne cette erreur.

+0

C'est pour la raison même que vous avez donné: la signature ne correspond pas à ce que l'OP a écrit. Il devrait y avoir peu ou pas de cas à ce stade où un optionnel implicitement déballé arrive de Cocoa. Les API Cocoa sont balisées de telle sorte que soit une chose n'est pas une option ou, si elle peut être nulle, c'est une option optionnelle (avec un point d'interrogation, pas un point d'exclamation). – matt

+0

@matt: Oui, mais cette erreur ne semble pas applicable ici. L'erreur correcte est autour de l'incompatibilité de type, pas autour de l'inférence de paramètre générique. –

+0

Vous dites que vous êtes surpris que le compilateur Swift ait donné une description trompeuse du problème? Vous ne devez pas avoir utilisé Swift très longtemps, si vous êtes si naïf! Ce genre de chose arrive tout le temps. - Le problème particulier ici est que, avec ce type ne correspondant pas, et aucun autre type fourni (l'OP les a tous effacés), Swift ne reconnaît pas cette fonction anonyme comme correspondant au type de bloc attendu pour cette méthode. Ainsi, les types de la fonction anonyme ne sont pas déductibles. – matt