gpt4 book ai didi

ios - iOS 中的有效负载数据是什么?

转载 作者:可可西里 更新时间:2023-11-01 00:43:33 25 4
gpt4 key购买 nike

我正在调试我的程序以检查属性值是否设置正确。我在这个函数中放置了一个断点:

func showContent(data: Any) -> UIView {
// breakpoint here
var contentView = UIView()
if let image = data as? UIImage {
let imageView = UIImageView()
imageView.image = image
contentView = imageView
}
if let text = data as? String {
let label = UILabel()
label.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
label.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
label.text = text
contentView = label
}
return contentView
}

传递给此函数的值来自 View Controller :

override func viewDidLoad() {
calcGroupFamiliarity()
flashCardView.linkedMemory = Memory(masteryLevel: 1, algorithm: Algorithm.algorithm1.chooseAlgorithm(), forgetRatio: 0, lastStudyTime: Date(), front: #imageLiteral(resourceName: "Ideas-Blue"), back: #imageLiteral(resourceName: "Ideas-Yellow"))
}

如您所见,frontback 都是图像,但是,在调试器中,它们都显示为一些payload_data ,而 masteryLevelalgorithm 等其他值的数据类型是正确的:

enter image description here

谁能解释一下这是什么意思?我应该怎么做才能传递正常的图像数据?

更新:

这是内存类:

class Memory: NSObject, NSCoding {

var masteryLevel: Int
var algorithm: [Int: Double]
var forgetRatio: Int
var lastStudyTime: Date
var strength: Double = 0
var front: Any
var back: Any
static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask)[0]
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("Memory")

init(masteryLevel: Int, algorithm: [Int: Double], forgetRatio: Int, lastStudyTime: Date, front: Any, back: Any){

self.masteryLevel = masteryLevel
self.algorithm = algorithm
self.forgetRatio = forgetRatio
self.lastStudyTime = lastStudyTime
self.front = front
self.back = back
}

...

}

最佳答案

这是 Swift 如何实现 Any 类型的细节。鉴于 Swift 无法事先知道您要放入什么,例如front,它需要存储指向该对象的指针(在 payload_data_0 中)以及指向有关存储对象类型的元数据的指针(在 instance_type 中) >).据我所知,payload_data_1payload_data_2 是一种优化,因此 Swift 可以在适当的位置存储最多 24 字节的大结构,而不必将它们放在需要存储在单独的堆位置的包装器对象。

因此,回答您的问题:这既不是 Swift 中的错误,也不是您这边的错误。您的数据以正确的方式存储和访问。如果您希望在调试时更轻松地检查 front,请尝试

(lldb) po front

在调试器中。或者,将 front 的类型更改为例如UIImage?。如果那不可能,您可以声明一个协议(protocol)

protocol MemoryStoreable: class { }

并像这样扩展需要存储在这些字段中的每种类型:

extension UIImage: MemoryStoreable { }

并将变量声明为

var front: MemoryStoreable?

请注意,MemoryStoreable 仅限于类,否则需要存储协议(protocol)见证(其实现方式与您观察到的 Any 字段类似)。

另一种选择是,如果您知道您将存储例如在 front 中只有图像和字符串,使用枚举:

enum MemoryStoreable {
case `string`(String)
case image(UIImage)
}

var front: MemoryStoreable?

尽管如此,这仍然需要至少 25 个字节的存储空间(由于内存对齐限制,可能需要 32 个字节),因为这是 String 结构的大小。

有关详细信息,请参见例如https://mikeash.com/pyblog/friday-qa-2014-08-01-exploring-swift-memory-layout-part-ii.html .

关于ios - iOS 中的有效负载数据是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42130147/

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