做毕设时理解开源代码时发现全部理解开源代码很费时间

Posted 祥瑞哈哈哈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了做毕设时理解开源代码时发现全部理解开源代码很费时间相关的知识,希望对你有一定的参考价值。

我感觉开源代码应该挑主要和重要的去理解。

如何安全地解开标头值

【中文标题】如何安全地解开标头值【英文标题】:how to safely unwrapped header value 【发布时间】:2018-03-25 10:39:15 【问题描述】:

我的应用程序崩溃,因为它在解开值“header”时发现 nil 我尝试使用保护 let 语句,虽然它不起作用,安全解开这个值的最佳方法是什么?

override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView 

    self.headerOpen = true

    if self.headerOpen == true 

      let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerId, for: indexPath) as! HomePageHeader

    header.currentUser = self.currentUser
    header.usersLocation = self.usersLocation
    header.delegate = self

    reloadInputViews()

     else if headerOpen == false 


        print("header open is false")

        




    return header!


【问题讨论】:

【参考方案1】:

if let ...guard let ... 可以帮助您。例如:

if let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerId, for: indexPath) as? HomePageHeader 
    print("header unwrapped")

guard let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerId, for: indexPath) as? HomePageHeader else  print("header not unwrapped") 
print("header unwrapped")

【讨论】:

如果 let 或 guard 似乎不起作用,我得到错误;条件绑定的初始化程序必须具有 Optional 类型,而不是 'HomePageHeader' 尝试将!替换为?【参考方案2】:

我尝试使用 guard let 语句,但它不起作用

因为您使用的是as!,所以! 表示值的强制解包,它忽略了可选类型,如果UICollectionReusableView 不符合HomePageHeader,您的应用程序将崩溃。

你必须使用as? 来保证这个安全,就像这样

guard let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerId, for: indexPath) as? HomePageHeader else 
    return UICollectionReusableView()


// do stuff with the header
header.currentUser = self.currentUser 

【讨论】:

【参考方案3】:

Swift 中,您可以使用以下方式之一unwrap an optional

1. 使用 ! 强制解开 optional 值。要使用!,您必须确保optional 不包含nil。使用! 有点冒险,因为解开nil 值会导致runtime exception

let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerId, for: indexPath) as! HomePageHeader

在上面的代码中,您强制解包,即as! HomePageHeader

collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerId, for: indexPath) 必须返回一个 nil,然后您将其解包,结果您的应用程序崩溃了。

2. 另一个可用于获取展开值的选项是使用 Optional Binding,即 if let 语句。 p>

您使用可选绑定来确定可选是否包含 值,如果是,则使该值可用作临时常量 或变量。可选绑定可以与 if 和 while 语句一起使用 检查可选值中的值,并提取该值 作为单个操作的一部分,转换为常量或变量。

在您的代码中,您可以像这样使用它:

if let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerId, for: indexPath) as? HomePageHeader

   header.currentUser = self.currentUser
   header.usersLocation = self.usersLocation
   header.delegate = self

Optional Binding 仅适用于 optionals。这就是为什么我使用as? HomePageHeader 而不是as! HomePageHeader

3.您也可以使用guard语句来处理optional的值。

守卫语句,如 if 语句,执行语句取决于 关于表达式的布尔值。您使用警卫声明 要求条件必须为真,以便后面的代码 要执行的保护语句。与 if 语句不同,守卫 语句总是有一个 else 子句—— else 子句中的代码是 条件不成立时执行。

在你的代码中,你可以像这样使用它:

guard let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerId, for: indexPath) as? HomePageHeader else

   return

header.currentUser = self.currentUser
header.usersLocation = self.usersLocation
header.delegate = self

如果您仍然遇到任何问题,请告诉我。

【讨论】:

以上是关于做毕设时理解开源代码时发现全部理解开源代码很费时间的主要内容,如果未能解决你的问题,请参考以下文章

部分文件后缀名全部变成.ZEPTO文件,已经证实是勒索病毒,有啥办法解开吗?

3.如何理解开多线程可以充分利用CPU?

了解开闭原则

做毕设的体会

SQL 查找是否”存在”,别再用 COUNT 了,真的很费时间!

Base64解密,请问这段代码如何解开?