2016-09-20 12 views
1

私のアプリケーションで共有ボタンを再統合しようとしています。 AppleはSwift 3の内容をiOS 10に変更しました。私はちょうどXcode 8のリリースバージョンに更新し、それは私にUIActivitiesといくつかの問題を与えてきました。SwiftのUIActivities 3

コンパイラが失敗しないように多くのものがUIActivityType.で始まることが判明しました。しかし、彼らの多くはまだcom.appleを使用しています。何らかの理由でactivityTypeアレイをタイプ[Any]にキャストしました。

だからこそ...誰でも彼らがそれをした理由を知っていますか? activityTypesToExclude.contains(where: (Any) throws -> Bool)メソッドのfor引数には何を入れますか?

答えて

5

UIActivityTypeは、アクティビティタイプの文字列表現のための型安全な薄いラッパーです。あらかじめ定義された定数を持たないアクティビティタイプがいくつか見つかった場合は、独自の拡張を定義することができます。

internal func _shouldExcludeActivityType(_ activity: UIActivity) -> Bool { 

    let activityTypesToExclude: [UIActivityType] = [ 
     .remindersEditorExtension, 
     .openInIBooks, 
     .print, 
     .assignToContact, 
     .postToWeibo, 
     .googleDriveShareExtension, 
     .streamShareService 
    ] 

    if let actType = activity.activityType { 
     if activityTypesToExclude.contains(actType) { 
      return true 
     } else if let superExcludes = super.excludedActivityTypes { 
      return superExcludes.contains(actType) 
     } 
    } 
    return false 
} 

あなたが直接スウィフト3コードで生の文字列表現を使用しないでください:上記の拡張子を持つ

extension UIActivityType { 
    static let remindersEditorExtension = UIActivityType(rawValue: "com.apple.reminders.RemindersEditorExtension") 
    static let googleDriveShareExtension = UIActivityType(rawValue: "com.google.Drive.ShareExtension") 
    static let streamShareService = UIActivityType(rawValue: "com.apple.mobileslideshow.StreamShareService") 
} 

は、あなたがこのような何かを書くことができます。

だから約なぜですか?:この変更により、プログラマーはactivityType識別子が必要な場所で、non-activityType文字列を誤って挿入する可能性がはるかに低くなります。

一部の文字列定数にも同様の変更が加えられました。たとえば、Notification.Nameです。

+0

この機能の使い方は混乱しています。私は '' 'activityViewController.excludedActivityTypes = [UIActivityType.streamShareService]' 'を試してみました。 '' '_shouldExcludeActivityType'''関数をどのように使って' '' com.apple.mobileslideshow.StreamShareService'''を除外できるか説明してください。 – breaktop

+0

まず、[this thread](http:// stackoverflow .com/q/31792506/6541007)。 (すでにチェックしたことがありますが、再度慎重にチェックしたことがあります)。受け入れられた回答に書かれているように、 '_shouldExcludeActivityType'はプライベートAPIであり、このAPIを使用するアプリケーションはアップルによって拒否されています。 Appleはいつでも、通知なしでいくつかの詳細な実装を変更するでしょう。あなた自身のリスクでそれらを試すことができますが、私は実際に何がうまくいくのかわからないので、 "それを使う方法"を説明することはできません。上記の答えは、 'UIActivityType'のインスタンスを作成する方法を説明することです。 – OOPer