gpt4 book ai didi

swift - 无法分配给属性 : 'self' is immutable in UIViewControllerRepresentable

转载 作者:行者123 更新时间:2023-11-30 10:31:45 26 4
gpt4 key购买 nike

我有以下代码片段:

struct player : UIViewControllerRepresentable {

var url : String
var player1: AVPlayer

func makeUIViewController(context: UIViewControllerRepresentableContext<player>) -> AVPlayerViewController {
let controller = AVPlayerViewController()
player1 = AVPlayer(url: URL(string: url)!)
controller.player = player1
return controller
}

func updateUIViewController(_ uiViewController: AVPlayerViewController, context: UIViewControllerRepresentableContext<player>) {
}

func pause() {
player1.pause()
}
}

这给出了错误:

'Cannot assign to property: 'self' is immutable'

我需要在 makeUIViewController 函数之外使用 AVPlayer,因为我需要从暂停函数访问它。我怎样才能做到这一点?

最佳答案

出现您所看到的错误是因为结构是值类型,并且其中任何更改其属性的方法都需要标记为mutating。不幸的是,您无法标记 makeUIViewController,因为它是在 UIViewControllerRepresentable 协议(protocol)中定义的,但有一个相当简单的解决方案。

您实际上只使用 url 来构造 AVPlayer - 无需保留它。为您的结构编写初始化程序,该结构采用 url 字符串并构造一个 AVPlayer。我已将 AVPlayer 设为可选,因为 URL(string: String) 返回一个 Optional URL (正如您可以想象的那样,并非所有字符串都是有效的 url) 。下面的代码按预期工作:

struct Player: UIViewControllerRepresentable {

var player1: AVPlayer?

public init(url string: String) {
guard let url = URL(string: string) else {
self.player1 = nil
return
}
self.player1 = AVPlayer(url: url)
}

func makeUIViewController(context: UIViewControllerRepresentableContext<Player>) -> AVPlayerViewController {
let controller = AVPlayerViewController()
controller.player = player1
return controller
}

func updateUIViewController(_ uiViewController: AVPlayerViewController,
context: UIViewControllerRepresentableContext<Player>) {}

func pause() {
player1?.pause()
}
}

旁注:Swift 中的所有类型名称(类、结构体、枚举)按照惯例都是大写的:您的结构体应该称为 Player 而不是 player。您还应该研究 CordinatorUIViewControllerRepresentable - 您需要一些东西来充当您的 AVPlayerViewControllerDelegate

关于swift - 无法分配给属性 : 'self' is immutable in UIViewControllerRepresentable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59037024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com