完整错误消息:
error: warning: <EXPR>:12:9: warning: initialization of variable '$__lldb_error_result' was never used; consider replacing with assignment to '_' or removing it
var $__lldb_error_result = __lldb_tmp_error
~~~~^~~~~~~~~~~~~~~~~~~~
_
error: <EXPR>:19:5: error: use of unresolved identifier '$__lldb_injected_self'
$__lldb_injected_self.$__lldb_wrapped_expr_7(
^~~~~~~~~~~~~~~~~~~~~
当我询问a的值时,这个错误出现在控制台中
Dictionary<String, String>
泛型中的属性
UITableViewController
(TVC)。
更多细节。。。
我有一个通用的TVC(如上所述),它或多或少地基于Florian Kugler和Daniel Eggert在《核心数据》一书中概述的框架,并采用了T的通用值。
class TVCDataSource_List<T: Managed, etc...>
这个通用的TVC包括一个字典,用于保存TVC章节标题的较长“备选”名称列表。
var dictionarySectionData: [String: String] = [:]
我选择用这种方式来编程TVC,因为将一个名字的引用保持为两个短字符似乎更有效
String
在数据模型属性(节标识符)中,将长名称作为
串
.
我尝试在代码中的许多不同位置填充这本词典,其中大多数都有效,但结果都相同,具体来说:
-
我使用调试器一步一步地检查代码,正如预期的那样,通过对持久存储的单个获取请求填充字典;
-
紧接着,打电话给
print(dictionarySectionData.description)
在控制台上,按预期打印出正确填充的词典;
-
使用
p dictionarySectionData
(或
po
)在这之前和之后
print
要进行控制台操作,请生成此问题开头详述的完整错误消息;
-
同时,助理编辑变量查看器将字典显示为空,这与打印内容惊人地冲突;
-
我继续一步一步地编写代码来构造TVC,因为字典不再有键值对,我无法回忆我的节头的值,正如预期的那样,控制台报告“致命错误:在展开可选值时意外发现了nil”。
我做了一些简单的研究:
-
这
Blog
由Scott Berrevoets撰写,标题为“重新绑定自我:调试器的断点”。
-
这
Swift Bug Report
Keith Smiley题为“LLDB:警告:变量“$”的初始化。
-
这
Swift Bug Report
Zev Eisenberg题为“错误:在NSAttributedString扩展中使用未声明的类型“$\uu lldb\u context”。
我可能有以下两种情况:
-
在编译器中偶然发现一个错误;或
-
试图将TVS中的self-c值绑定到self-set编译器中,以尝试重新解释TVS??
坦率地说,我对编译器和Swift的浅薄了解使我无法理解这两种语言,这两种语言都需要我数月甚至数年的学习和经验。我很高兴随着时间慢慢积累。
我有一个满意的解决方案。。。在TVC生命周期的开始,我没有为TVC的节头构建一个较长的“可选”名称字典,而是在每次代码解析当前TVC节头的名称时运行一个获取请求。这可以完美地工作,并且不会阻塞UI(目前)。
然而,让我非常恼火的是,我不能在构建通用TVC的开始就运行一个fetch,为TVC的节头准备一个包含较长“可选”名称的简明词典,而是必须为用户决定滚动的每个节运行fetch。执行一次提取并在内存中保存一个包含12-15个键值对的字典似乎比运行多次提取要高效得多。
有人遇到过这个问题吗?
如果是这样,你能提供任何建议吗?
使现代化
问题似乎在于我使用了——或者更准确地说,是我滥用了——显式打开的包装
Optional
.
下面是我用来填充字典的代码。。。
func createDictionaryOfSectionHeaderText() {
let request = Types.preparedFetchRequest
// noting .preparedFetchRequest is a static var, available through generics
let key = "typeParent.typeParentName"
let name = "Taxonomy"
let predicate = NSPredicate(format: "%K == %@", argumentArray: [key, name])
request.predicate = predicate
var results: [Types] = []
do {
results = try <<My NSManagedObjectContext>>.fetch(request)
}
catch {
let fetchError = error
print(fetchError)
}
for type in results {
let formatSortOrder = String(format: "%02d", type.sortOrder)
dictionarySectionData[formatSortOrder] = type.typeName
}
}
有两个代码元素导致了错误消息。。。
A.如上所述:
func createDictionaryOfSectionHeaderText()
let stringSortOrder = String(type.sortOrder)
let formatSortOrder = String(format: "%02d", stringSortOrder)
...正在将字符串输入“%02d”格式,不确定效果。。。TBA。
(现在从这两行改为单行。)
let formatSortOrder = String(format: "%02d", type.sortOrder)
-这当然有效。)
B.在
UITableViewDelegate
方法
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
stringHeaderText = dictionarySectionData[stringSectionName]!
// "Fatal error: Unexpectedly found nil while unwrapping an Optional value"
...在对这个问题进行更多思考之后,当显式地展开可选项时,它与预期完全一致,而该可选项为零!!
所以,当我把二传手换成
stringHeaderText
通过删除显式展开的指令,并在nil时提供一个默认值,我的编程问题就消失了。
stringHeaderText = dictionarySectionData[stringSectionName] ?? "ERROR"
如果我能更好地理解这一点,我甚至可以给出一个答案。