2017-02-09 2 views
1

Я отладка моей программы, чтобы проверить, если значение свойства установлено правильно, я поставил точку останова в этой функции:Что такое данные полезной нагрузки в iOS?

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 
} 

значение, передаваемое эту функцию от контроллера вида:

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")) 
} 

, как вы можете видеть, как front и back образы, однако, в отладчике они оба появились как некоторые payload_data, в то время как тип данных других значений, таких как masteryLevel, algorithm правильны:

enter image description here

Может кто-нибудь объяснить, что это значит? И что мне делать, чтобы передавать нормальные данные изображения?

Update:

Это Memory класс:

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 
} 

... 

} 
+0

Для payload_data см https://medium.com/@ vhart/protocols-generics-and-existential-container-wait-what-e2e698262ab1 # .947l6tczk Как выглядит ваш класс памяти? –

+0

@AndreasOetjen спасибо, плз см. Обновление –

ответ

2

Это деталь, как Swift реализует Any тип. Учитывая, что Свифт не может заранее знать, что вы делаете, например, front, ему необходимо сохранить указатель на этот объект (в payload_data_0), а также указатель на метаданные о типе сохраненного объекта (в instance_type). Насколько я знаю, payload_data_1 и payload_data_2 существуют как оптимизация, так что Swift может хранить до 24 байтовых больших структур вместо того, чтобы помещать их в объект-обертку, который необходимо сохранить в отдельном месте кучи.

Итак, чтобы ответить на ваш вопрос: Это не ошибка в Swift, а также ошибка на вашей стороне. Ваши данные будут правильно сохранены и доступны. Если вы предпочитаете, чтобы проверить front более легко во время отладки, попробуйте

(lldb) po front 

в отладчике. Альтернативно, можно изменить тип front, например. UIImage?. Если это не представляется возможным, можно объявить протокол

protocol MemoryStoreable: class { } 

и расширить каждый тип, который должен храниться в этих областях, как так:

extension UIImage: MemoryStoreable { } 

и объявить переменную как

var front: MemoryStoreable? 

Обратите внимание, что MemoryStoreable ограничен классами, так как в противном случае должен храниться протокол свидетеля (который снова реализуется аналогично полям Any, которые вы наблюдаете г).

Другим вариантом может быть, если вы знаете, что будете хранить, например. только изображения и строки в front, чтобы использовать перечисление:

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

var front: MemoryStoreable? 

Это будет по-прежнему требует, по крайней мере, 25 байт памяти в вашем объекте (возможно, 32 из-за ограничения выравнивания памяти), хотя, как это размер String struct.

Для получения дополнительной информации см., Например, https://mikeash.com/pyblog/friday-qa-2014-08-01-exploring-swift-memory-layout-part-ii.html.

+0

Это очень хороший ответ, требуется немного времени, чтобы переварить tho, спасибо! –

0

Основание на замечательном ответе MrMage.

@MrMage дал 2 предложений о подходе к этой проблеме, потребовался некоторое усилия для меня, чтобы схватить их, за то, что я хотел достичь в программе , это идеальный вариант для меня, чтобы идти протокольно-ориентированным Программирующ.

Вот очень легко понять, учебник, который поможет мне много: Introduction to Protocol Oriented Programming in Swift

Надеемся, что это может быть полезным для вас :)

Смежные вопросы