我正在尝试重构应用程序的现有实现,使其符合 Swift 6。为此,我必须接触以下提供“在 Safari 中打开 url”共享扩展的类:
import Foundation
import UIKit
public final class SafariActivity: UIActivity {
var url: URL?
// MARK: - UIActivity Implementation
public override var activityType: UIActivity.ActivityType {
.openInSafari
}
public override var activityTitle: String? {
"Open in Safari"
}
public override var activityImage: UIImage? {
UIImage(systemName: "safari")?.applyingSymbolConfiguration(.init(scale: .large))
}
public override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
// ERROR: Main actor-isolated class property 'shared' can not be referenced from a nonisolated context
activityItems.contains { $0 is URL ? UIApplication.shared.canOpenURL($0 as! URL) : false }
}
public override func prepare(withActivityItems activityItems: [Any]) {
// ERROR: Main actor-isolated class property 'shared' can not be referenced from a nonisolated context
url = activityItems.first { $0 is URL ? UIApplication.shared.canOpenURL($0 as! URL) : false } as? URL
}
public override func perform() {
if let url = url {
// ERROR: Call to main actor-isolated instance method 'open(_:options:completionHandler:)' in a synchronous nonisolated context
UIApplication.shared.open(url)
}
self.activityDidFinish(true)
}
}
extension UIActivity.ActivityType {
static let openInSafari = UIActivity.ActivityType(rawValue: "openInSafari")
}
extension UIActivity {
@MainActor public static let openInSafari = SafariActivity()
}
我很难理解将覆盖的方法限制在主线程的正确方法。如何将覆盖的方法从UIActivity
隔离改为@MainActor
?