不能';t将SwiftUI.extensionelegate转换为extensionelegate

不能';t将SwiftUI.extensionelegate转换为extensionelegate,swiftui,watchos,Swiftui,Watchos,使用SwiftUI架构WatchOS应用程序,如果您想使用ExtensionLegate,您需要创建自己的应用程序。我已经这样做了,但是当我试图实际访问代码中的委托时,我收到以下错误消息:无法将类型为SwiftUI.extensionelegate'(0x7fff8441b480)的值强制转换为“TestMe\u WatchKit\u Extension.extensionelegate”(0x10c3b36d0)。 我已将ExtensionLegate定义为- class ExtensionD

使用SwiftUI架构WatchOS应用程序,如果您想使用ExtensionLegate,您需要创建自己的应用程序。我已经这样做了,但是当我试图实际访问代码中的委托时,我收到以下错误消息:无法将类型为
SwiftUI.extensionelegate'(0x7fff8441b480)的值强制转换为“TestMe\u WatchKit\u Extension.extensionelegate”(0x10c3b36d0)。

我已将ExtensionLegate定义为-

class ExtensionDelegate: NSObject, WKExtensionDelegate {
    var meetingStatistics:  MeetingStatistics = MeetingStatistics()
    override init(){
        super.init()
    }
    func applicationDidFinishLaunching() {
        // Perform any final initialization of your application.
        print("applicationDidFinishLaunching for watchOS")
    }
    func applicationDidBecomeActive() {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }
    func applicationWillResignActive() {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, etc.
    }
}
在my@main中,我有以下内容:

@main
struct WatchApp: App {
@WKExtensionDelegateAdaptor(ExtensionDelegate.self) var delegate
// code

}
当我尝试以身份访问代理时-
let delegate=WKExtension.shared()。委托为!ExtensionDelegate
我得到了上面的错误。

WKExtension.shared().delegate不是您的ExtensionDelegate,而是内部的
SwiftUI.ExtensionDelegate
(如上所述),它提供了适配器delegate。您必须使用为via提供的适配器委托的唯一实例(到处传递)

@WKExtensionDelegateAdaptor(ExtensionDelegate.self) var delegate
更新:

要使用您的
委托
,您必须将其作为view旁边的参数传递,例如as environment(因此您可以在任何子视图中将其作为
@environment(\.appDelegate)var appDelegate

var body: some Scene {
    WindowGroup {
       ContentView()
          .environment(\.appDelegate, delegate)
    }
}


我在macOS中也有同样的问题。在@main App struct中声明一个类作为应用程序委托后:

@NSApplicationDelegateAdaptor(AppDelegate.self) var applicationDelegate
应用程序启动时,AppDelegate已正确初始化。 我声明环境密钥:

struct DelegateKey: EnvironmentKey {
    typealias Value = AppDelegate
    static let defaultValue: AppDelegate = AppDelegate()
}

extension EnvironmentValues {
    var appDelegate: DelegateKey.Value {
        get {
            return self[DelegateKey.self]
        }
        set {
            self[DelegateKey.self] = newValue
        }
    }
}
要通过访问变量,请执行以下操作:
@环境(\.appDelegate)变量appDelegate

var body: some Scene {
    WindowGroup {
       ContentView()
          .environment(\.appDelegate, delegate)
    }
}
这对于所有SwiftUI环境都很好。 问题在于,对应用程序的常规访问通过
NSApp.delegate
不再工作了

解决方案是在AppDelegate类本身中声明一个静态变量:

class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject {
   
   @Environment(\.appDelegate) static var shared
}
这使得实例化的AppDelegate对象可以通过以下方式从任何地方访问:
AppDelegate.shared

.

好吧,-同时我收集了更多的经验。对于我的应用程序委托来说,重要的是它是一个单实例(只存在一个实例)。我意识到我有两个实例

@NSApplicationDelegateAdaptor(AppDelegate.self) var applicationDelegate
在SwiftUI中,App struct初始化第一个。在这个App struct中,我添加了一个init()方法

这会在程序的早期初始化AppDelegate静态变量“shared”

我删除了对委托、密钥、默认值等的所有基于@Environment的访问。全局访问由

AppDelegate.shared

自定义@Environment变量的问题是,只能使用.Environment(keyPath:,value:)设置它们视图上的修饰符。但是,我的委托在第一个视图设置环境变量之前被访问。因此,我的AppDelegate共享变量现在是一个普通的静态变量,我会尽可能早地在init()中设置它App struct的方法。

哦,当我试图以@environmentObject的形式访问它时,我没有收到错误,但当我试图在另一个类中访问它时,我得到了'let delegate=WKExtension.shared().delegate as!ExtensionDelegate`-鉴于此。我在iOS、macOS、tvOs和watchOS之间使用此代码,只有watchOS断开了此委托。````如果os(macOS)让delegate=NSApplication.shared.delegate as!AppDelegate#elseif os(iOS)| os(tvOs)让delegate=UIApplication.shared.delegate as!AppDelegate#elseif os(watchOS)让delegate=WKExtension.shared().delegate为!ExtensionDelegate#endif``当我进入access
let delegate=WKExtension.shared()时,我仍在调试器中.delegate as!extensionelegate
谢谢这有助于澄清问题,但当我尝试访问AppDelegate时,它的值为nil。当我尝试访问在应用程序启动中创建的相关类中的该值时,我仍然会得到一个nil值。似乎AppDelegate不是在extensionelegate的init检查ini之前创建的通过init()中的注释行初始化我的AppDelegate方法。它在我的应用程序启动时很早就初始化了。这可能是由于在实例化它的
struct DelegateKey
中定义了默认值。在这里,我偏离了常用模式,没有声明它为nil,也没有声明它为可选值。M Wilm,我尝试使用相同的
struck初始化t DelegateKey:EnvironmentKey{typealias Value=extensionelegate?static let defaultValue:extensionelegate?=extensionelegate()}
但这仍然会导致原始错误。明白了!谢谢。。
AppDelegate.shared