2016-10-28 4 views
0

を型「Swift._NSContiguousString」の値をキャストできませんでした:は、私は、サービスと呼ばれるタプルのコレクションを持っている「(Swift.String、UIImage、Swift.String)」に

let services = [ 
    (name: "iCloud", image: #imageLiteral(resourceName: "iCloudLogo"), url: "http://www.icloud.com"), 
    (name: "Exchange", image: #imageLiteral(resourceName: "ExchangeLogo"), url: "http://www.exchange.com") 
] 

私はそのコレクションビューを持っています私はこのコレクションを代表するために使用します。私は、これらの項目のタップをキャプチャし、セグエを行い、送信者として個々のタプルを渡すためにUICollectionViewDelegateプロトコルから

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    let service = services[indexPath.item] 

    performSegue(withIdentifier: "showAuthWindow", sender: service) 
} 

を使用しています。

私はこのセグをキャプチャするためにセグを準備し、viewControllerlinkプロパティを設定します。私はタプル型に戻っAny?からsenderをキャストするときしかし、私はエラーを取得する:

Could not cast value of type 'Swift._NSContiguousString' to '(Swift.String, UIImage, Swift.String)'

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "showAuthWindow" { 
     let service = sender as! (name: String, image: UIImage, url: String) 
     let authWindow = segue.destination as! AuthorisationViewController 
     authWindow.link = service.url 
    } 
} 

誰かが理由を教えてもらえますか?

答えて

0

送信者はあなたのデータではありません。 Senderは、segueを開始したオブジェクトです(通常、ボタンやテーブルビューなど)。 View Controllerと違いがある場合を除いて、送信側を無視することはかなり標準です(追加ボタンをタップすると、宛先は編集モードではなく追加モードでそれを知る必要があります)。選択したインデックスパスを使用して、タップされたセルが分かります。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "showAuthWindow" { 
      guard let indexPath = collectionView?.indexPathsForSelectedItems?.first else { 
       return 
      } 
      let service = services[indexPath.item] 
      let authWindow = segue.destination as! AuthorisationViewController 
      authWindow.link = service.url 
     } 
    } 
+0

答えをいただきありがとうございますが、すでに有効な代替方法があり、説明した規約を理解しています。しかし、この問題を尋ねる本来の目的は、この場合、なぜ「Any?」からタプルにキャストできないのかを理解することです。 – Lew

関連する問題