Swift Combine 属性继承在 Xcode 11.4 beta 2 / iOS 13.4 上抛出“致命错误:调用已删除方法”

Bos*_*sOz 10 xcode ios swift combine xcode11.4

我正在尝试使用 Swift Combine 来获取属性的更改事件。

我有这个发布isLogged属性的类

class CurrentUser: Account {
    static let me = CurrentUser() //Singleton 

    @Published var isLogged: Bool = false

}
Run Code Online (Sandbox Code Playgroud)

从发布该profileImageVersion属性的另一个类继承

class Account {

    @Published var profileImageVersion: String?

    init(){
       self.profileImageVersion = ""
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试订阅已发布的继承profileImageVersion属性,但没有成功!

// Subscribe to account image changes
userImageChangedSubscriber = CurrentUser.me.$profileImageVersion.receive(on: DispatchQueue.main).sink(receiveValue: { (imageVersion) in           
       ...
    }
})
Run Code Online (Sandbox Code Playgroud)

错误是 Fatal error: Call of deleted method

另一方面,如果我订阅了该isLogged属性,则一切正常...

// Subscribe to logged changes
userLoggedSubscriber = CurrentUser.me.$isLogged.receive(on: DispatchQueue.main).sink(receiveValue: { (logged) in
   ...
})
Run Code Online (Sandbox Code Playgroud)

此错误仅在 Xcode 11.4 beta 2 / iOS 13.4 上引发。
使用 Xcode 11.3.1 / 13.3 一切正常!

gda*_*vis 0

我遇到了同样的崩溃,作为临时解决方法,我发现将所有已发布的属性移动到您正在使用的具体类将解决该问题。我有这样的设置:

class EpisodesViewModel {
  @Published var episodes: [Episode]

  init(fetchRequest: NSFetchRequest<Episode>, context: NSManagedObjectContext? = nil) throws {
    ...
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

这个模型的子类只给出了一个获取请求:

final class LatestEpisodesViewModel: EpisodesViewModel {
    init() throws {
        try super.init(fetchRequest: Episode.latestFetchRequest())
    }
}
Run Code Online (Sandbox Code Playgroud)

通过更改我的设置,我能够修复崩溃:

class EpisodesViewModel {
    var fetchedEpisodes: [Episode]

    init(fetchRequest: NSFetchRequest<Episode>, context: NSManagedObjectContext? = nil) throws {
        ...
    }
    ...
}

final class LatestEpisodesViewModel: EpisodesViewModel {

    @Published var episodes: [Episode] = []

    override var fetchedEpisodes: [Episode] {
        didSet {
            episodes = fetchedEpisodes
        }
    }

    init() throws {
        try super.init(fetchRequest: Episode.latestFetchRequest())
    }
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这确实像是苹果的一个错误,但这同时让我解决了这个问题。