Swift 5 LLDB错误:警告:<expr>:12:9:警告:从未使用变量'$ __ lldb_error_result'的初始化

时间:2019-04-15 08:15:36

标签: swift uitableview dictionary generics lldb

完整错误消息:

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(
    ^~~~~~~~~~~~~~~~~~~~~

当我查询通用Dictionary<String, String>(TVC)中的UITableViewController属性值时,该错误会出现在控制台中。

更多详细信息...

我有一个通用的TVC(如上所述),它或多或少地基于Florian Kugler和Daniel Eggert在“核心数据”一书中概述的框架,并且除其他外还采用了T的通用值。

>
class TVCDataSource_List<T: Managed, etc...>

此通用TVC包括一个字典,该字典旨在容纳TVC的部分标题的更长的“替代”名称列表。

var dictionarySectionData: [String: String] = [:]

我选择以这种方式对TVC进行编程,因为在数据模型属性(节标识符)中将名称作为短两个字符String的引用比将长名称作为引用似乎更有效。 String

我曾尝试在代码中的许多不同位置填充此词典,大多数可以工作,但都具有相同的结果,具体来说:

  • 我使用调试器逐步执行代码,并按预期方式,通过对持久性存储的单个提取请求填充字典;
  • 紧随其后的是,控制台上对print(dictionarySectionData.description)的调用将打印出正确填充的字典,如预期的那样;
  • 在此p dictionarySectionData进行控制台操作之前和之后立即使用po(或print)查询LLDB,会在此问题开始时生成详细的完整错误消息;
  • 同时,助理编辑器变量查看器显示字典为空,这与打印令人惊讶地冲突;
  • 我继续逐步完成代码以构造TVC,因为字典不再具有其键值对,我无法调出我的节头的值,并且按预期,控制台报告“致命错误:意外地找到nil,展开一个可选值”。

我做了一些简单的研究:

  1. Scott Berrevoets的这个Blog,标题为“重新绑定自身:调试器的中断点”。
  2. Keith Smiley的Swift Bug Report题为“ LLDB:警告:变量'$ __ lldb_error_result'的初始化”。
  3. Zev Eisenberg的这个Swift Bug Report标题为“错误:在NSAttributedString扩展名中使用未声明的类型'$ __ lldb_context'”。

似乎我可能有一个:

  • 偶然发现了编译器中的错误;或
  • 试图在通用TVC中设置字典的值,以便编译器解释重新绑定到self的尝试?

坦率地说,我都不了解,并且从我对编译器和Swift的浅浅了解,都不会花费我数月甚至数年的学习和经验。我很高兴随着时间的推移逐渐积累。

我确实有一个令人满意的解决方案...而不是在TVC生命周期开始时为TVC的节标题构建更长的“替代”名称的字典,而是在每个时间运行提取请求,代码将为当前的TVC部分标题。这样可以完美工作,并且不会阻止UI。

但是,真正让我烦恼的是,我无法在通用TVC的构建开始时运行一次抓取操作,就无法为TVC的节标题准备一个简短的包含较长“替代”名称的简明词典,而不得不为每个段头运行一次抓取操作用户决定滚动浏览的部分。执行一次访存并在内存中保存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"

...经过进一步思考后,当显式展开Optional时(当Optional为nil时,)完全符合预期!

因此,当我通过删除指令以显式展开来将setter更改为stringHeaderText并在nil时提供默认值时,我的编程问题就消失了。

stringHeaderText = dictionarySectionData[stringSectionName] ?? "ERROR"

如果我更了解这一点,我什至可以提供答案。

1 个答案:

答案 0 :(得分:0)

这些问题应在XCode 12中解决。 XCode 10和11中确实存在很多错误,尤其是在泛型方面。