Как создать более общий способ получить все свойства структуры и установить их?IOS

Программируем под IOS
Ответить
Anonymous
 Как создать более общий способ получить все свойства структуры и установить их?

Сообщение Anonymous »

У меня есть множество типов ячеек для отображения в моем uitableview . Я генерирую повторный идентификатор для ячеек на основе того, являются ли такие свойства, как заголовок, тело, метаданные, любимые и т. Д. Таким образом, каждое свойство может иметь два состояния: true или false. < /P>

Код: Выделить всё

struct ReuseIdentifier : Codable, CustomStringConvertible {

var description : String {
let encoder = JSONEncoder()
encoder.outputFormatting = .sortedKeys
guard let data = try? encoder.encode(self), let str = String(data: data, encoding: .utf8) else {
return ""
}
return str
}
let sectionTitle : Bool
let title : Bool
let body : Bool
let metadata : Bool
let favicon : Bool
let onCommentsPage : Bool
let indent : Bool
let collapsed : Bool

static var allPermutations : [ReuseIdentifier] {
var result = [ReuseIdentifier]()

for i in 0.. 0) & 1 == 1,// Notice how all these needs to be hardcoded
title: (i >> 1) & 1 == 1,
body: (i >> 2) & 1 == 1,
metadata: (i >> 3) & 1 == 1,
favicon: (i >> 4) & 1 == 1,
onCommentsPage: (i >> 5) & 1 == 1,
indent: (i >> 6) & 1 == 1,
collapsed: (i >> 7) & 1 == 1
)
)
}

return result
}
}

extension String {
var decodedReuseIdentifier : ReuseIdentifier? {
guard let data = data(using: .utf8), let d = try? JSONDecoder().decode(ReuseIdentifier.self, from: data) else {
return nil
}
return d
}
}
В инициировании моей пользовательской ячейки я декодировал строку повторного использования для соответствующего повторного reuseIdentifier :

Код: Выделить всё

class Cell: UITableViewCell {

private var slidingView = UIView()
var title : UILabel?
var body : UILabel?
//....rest

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)

guard let decodedReuseIdentifier = reuseIdentifier?.decodedReuseIdentifier else {
print("Failed to decodedReuseIdentifier")
return
}

//Create each view based upon whether decodedReuseIdentifier's variable is true or false

}

}
Я использую мой повторный идентификатор allpermutations , чтобы зарегистрировать соответствующую повторную ячейку:

Код: Выделить всё

ReuseIdentifier.allPermutations.forEach { id in
tableView.register(Cell.self, forCellReuseIdentifier: id.description)
}
Затем в моей функции cellforrowat я создаю повторный идентификатор и deque a ячейки с его строкой Описание:

Код: Выделить всё

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let record = records[indexPath.row]

let reuseIdentifier = ReuseIdentifier(sectionTitle: record.sectionTitle != nil, title: record.title != nil, body: record.body != nil, metadata: record.domain != nil || record.author != nil, favicon: record.domain != nil, onCommentsPage: isCommentsPage, indent: record.indent ?? 0 > 0, collapsed: false)

let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier.description, for: indexPath) as! Cell

//....rest

}
Есть ли более общий способ для моей функции AllPermutations ? Как -то, где мне не нужно указывать имя каждого свойства и индексы? Как вы заметили, в настоящее время мне приходится жесткий код всех имен свойств, а также 8 и индексы.
Альтернативно, есть ли лучший способ сделать это?>

Подробнее здесь: https://stackoverflow.com/questions/795 ... -and-setti
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»