2016-04-26 7 views
-1

私は以下のクラスを使用しています。文字列内のすべての電子メールを抽出する方法を持っています。私は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

何が質問ですか? – matt

+0

@matt申し訳ありませんが提出中に質問が失われました。私は質問を編集しました。 –

答えて

1

、あなたのブロックはNSTextCheckingResult!を求めているが、署名はNSTextCheckingResult?を期待しています。ブロックをusingBlock: { (result: NSTextCheckingResult?, _, _) inに変更すると、コンパイラがサイレントになります。

私はコンパイラがなぜそのエラーを出すのか分かりません。

+0

あなたが与えたのはそれが理由です。署名はOPが書いたものと一致しません。明示的にアンラップされたオプションがCocoaから到着するこの時点では、ほとんどまたはまったくのケースが存在しないはずです。 Cocoa APIはマークアップされているので、物はオプションではありません。また、通常のオプションです(感嘆符ではなく、疑問符が付きます)。 – matt

+0

@matt:はい、そのエラーはここでは当てはまらないようです。正しいエラーは型不一致の周りであり、一般的なパラメータ推論の周りではありません。 –

+0

あなたは、Swiftコンパイラが問題の誤解を招くような記述をしたことに驚いていると言いますか?あなたが素朴なのであれば、あなたは非常に長いスイフトを使っていてはいけません!そんなことはいつも起こります。 - ここで特に問題となるのは、そのタイプが一致しておらず、他のタイプが指定されていない(OPがそれらをすべて無効にしている)場合、Swiftはこの無名関数をこのメソッドの期待されるブロックタイプとまったく同じものとして認識しません。したがって、無名関数の型は推論できません。 – matt

関連する問題