Swift 如何在没有第三方框架的情况下在ViewController中正确初始化可编码结构?

Swift 如何在没有第三方框架的情况下在ViewController中正确初始化可编码结构?,swift,Swift,我一直在尝试使用ViewController上的故事板初始化一个可编码的结构,但它不起作用 你知道如何解决这个问题吗 提前谢谢 以下是我在View Controller上尝试的内容: var images: ImageRequest init(images: ImageRequest) { self.images = images } 上面的代码错误: 错误:“UIViewController”的子类必须提供必需的“初始值设定项”init(编码器:)” 上面的代码错误: 在从初始值设

我一直在尝试使用ViewController上的故事板初始化一个
可编码的
结构,但它不起作用

你知道如何解决这个问题吗

提前谢谢

以下是我在View Controller上尝试的内容:

var images: ImageRequest

init(images: ImageRequest)
{
    self.images = images
}
上面的代码错误:

错误:“UIViewController”的子类必须提供必需的“初始值设定项”init(编码器:)”

上面的代码错误:

在从初始值设定项返回之前,不会在所有路径上调用“super.init”

上面的代码崩溃了。错误消息:

线程1:致命错误:尚未实现init(编码器:)

以下是我在结构上尝试的内容:

public struct ImageRequest: Codable {
    public var albumId: Int
    public var id: Int
    public var title: String
    public var url: URL
    public var thumbnailUrl: URL

    public init( albumId: Int, id: Int, title: String, url: URL, thumbnailUrl: URL) {
        self.albumId = 0
        self.id = 0
        self.title = ""
        self.url = URL(string: "")!
        self.thumbnailUrl = URL(string: "")!
    }
}

您可能正在使用序列图像板,尝试创建此视图控制器时会调用方法
init?(编码器:
)。在
init?(编码器:
中,您给出了导致错误的致命错误。您需要使用已创建的自定义初始值设定项,而不是使用序列图像板提供的
init?(编码者:
初始值设定项

以下是您需要的代码要点。但是,您必须进行修改,使其能够根据您的需求工作

class ViewController: UIViewController {

    var someProperty: String

    init(property: String) {
        someProperty = property
        super.init(nibName: nil, bundle: nil)

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController

        view = viewController.view
    }

    required init?(coder: NSCoder) {
        someProperty = ""
        super.init(coder: coder)
    }
}

故事板中的视图控制器始终使用
init?(coder:)
初始化。除了iOS传递的
coder
之外,您不能将任何参数传递给该初始化器

因此,您必须设计另一种方法来初始化
图像

  • init?(编码器:)
    中初始化它
  • 将其声明为可选,并在
    viewDidLoad()中对其进行初始化
  • 如果视图控制器是通过segue访问的,则将其声明为可选的,并在源VC的
    prepareforsgue(u:sender:)
    方法中为其赋值

  • 您选择的方法在很大程度上取决于应用程序的体系结构以及
    ImageRequest
    的数据来源。

    “上述代码崩溃。崩溃时是否有错误消息?实际上,您试图做的是如何使用自定义参数初始化故事板中的ViewController,否?请参见:是。这是错误消息:线程1:致命错误:init(编码器:)尚未实现。我需要在ViewController中使用该结构模型,它将从api接收数据。如果我尝试使用自定义初始值设定项,Xcode会抱怨,正如我在帖子中提到的:错误:“必需的“初始值设定项”init(编码者:)'必须由'UIViewController'的子类提供。我添加了一小部分代码。但是,它只是一个帮助器,可以帮助您理解它有多麻烦。最好的情况是使用实例化VC和设置所需变量的常规方法。的确,它会变得混乱。我尝试了该代码,并给了我以下错误:Property'self.somePproperty'未在super.init调用中初始化当您说实例化VC的普通方法时,您的意思是哪种方法在我的情况下可以工作?谢谢您可以通过向您的属性提供默认值来删除该错误。我已编辑代码以修复此问题,我错过了该行。我已将该方法提供给InstanceViewController在上面的解决方案中。在另一个VC中使用该方法并设置属性值。如果它是字符串,但类型是ImageRequest,则该方法有效,我将如何为ImageRequest类型的someProperty指定默认值?
    public struct ImageRequest: Codable {
        public var albumId: Int
        public var id: Int
        public var title: String
        public var url: URL
        public var thumbnailUrl: URL
    
        public init( albumId: Int, id: Int, title: String, url: URL, thumbnailUrl: URL) {
            self.albumId = 0
            self.id = 0
            self.title = ""
            self.url = URL(string: "")!
            self.thumbnailUrl = URL(string: "")!
        }
    }
    
    public struct ImageRequest: Codable {
        public var albumId: Int
        public var id: Int
        public var title: String
        public var url: URL
        public var thumbnailUrl: URL
    
        public init( albumId: Int, id: Int, title: String, url: URL, thumbnailUrl: URL) {
            self.albumId = albumId
            self.id = id
            self.title = title
            self.url = url
            self.thumbnailUrl = thumbnailUrl
        }
    }
    
    class ViewController: UIViewController {
    
        var someProperty: String
    
        init(property: String) {
            someProperty = property
            super.init(nibName: nil, bundle: nil)
    
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let viewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
    
            view = viewController.view
        }
    
        required init?(coder: NSCoder) {
            someProperty = ""
            super.init(coder: coder)
        }
    }