Swift中的UIActivities 3

KSi*_*att 2 ios swift swift3

尝试在我的应用程序中重新集成共享按钮.苹果再次改变了一些事情Swift 3iOS 10.我刚刚更新到Xcode 8发布版本,它一直在给我一些问题UIActivities.

发现它们中的许多现在UIActivityType.都是为了使编译器不会失败而开始的.然而,他们中的许多人仍在使用com.apple它也使我因某种原因将activityType数组转换为类型[Any].

那么......有谁知道他们为什么这样做?你在activityTypesToExclude.contains(where: (Any) throws -> Bool)方法中的for参数中放了什么?

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

            let activityTypesToExclude = [

                "com.apple.reminders.RemindersEditorExtension",
                UIActivityType.openInIBooks,
                UIActivityType.print,
                UIActivityType.assignToContact,
                UIActivityType.postToWeibo,
                "com.google.Drive.ShareExtension",
                "com.apple.mobileslideshow.StreamShareService"

            ] as [Any]

            if let actType = activity.activityType {
                if activityTypesToExclude.contains(where: (Any) throws -> Bool) {
                    return true
                }
                else if super.excludedActivityTypes != nil {
                    return super.excludedActivityTypes!.contains(actType)
                }
            }
            return false
}
Run Code Online (Sandbox Code Playgroud)

OOP*_*Per 7

UIActivityType是一个类型安全的瘦包装器,用于表示活动类型的String.如果您找到了一些没有预定义常量的活动类型,您可以使用扩展名定义自己的活动类型.

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")
}
Run Code Online (Sandbox Code Playgroud)

使用上面的扩展,你可以写这样的东西:

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
}
Run Code Online (Sandbox Code Playgroud)

您不应该直接在Swift 3代码中使用原始字符串表示.

那么,为什么他们这样做呢?:通过此更改,程序员在意外地包含activityType标识符所需的非活动类型字符串的机会大大减少.

例如,对一些String常量进行了类似的更改Notification.Name.