swift 2 个转换帮助 - 89 个问题

swift 2 conversion help - 89 issues

所以我刚刚完成了我的第一个使用 swift 1.2 构建的应用程序并为 ios 8 制作。上周它成功地到达了应用程序商店,但现在是我更新的时候了ios 9 和 swift 2.

的代码

之前的应用程序运行完美,没有任何问题,没有崩溃,但在 xcode 7 中打开完全相同的项目会引发 89 个问题。我已经完成了 xcode 会自动为我转换的过程,但仍然存在问题。我已经到了所有构建问题都消失的地步,但该应用程序无法运行。我什至无法通过我的登录屏幕,因为点击输入字段输入用户名和密码甚至不会注册我的触摸并让我输入。

从花费大量时间制作一个正常运行的应用程序到现在完全无法运行,这是非常令人沮丧的。

有没有人对我如何按照自己的方式工作并让我的应用程序恢复到可以正常工作的位置有什么好的建议,但 ios9 和 swift 2 除外?我应该让 Xcode 为我转换它并从那里开始工作吗?我应该自己皈依吗?任何帮助都会很棒,因为我对这一切还很陌生。就在我以为我正在解决其中的一些问题时,一切都变了。

如果这有帮助,我会遇到一些示例错误:

-这告诉我 "Downcast from 'CLLocation?' to 'CLLocation' only unwraps optionals; did you mean to use '!'?" 不知道要做什么。

    let locationUpdated = locations.last as! CLLocation

-变量 currentUser 已写入但从未读取

var currentUser = PFUser.currentUser()

我建议您不要使用转换器并自行解决错误,尝试理解 Swift 1.2 -> Swift 2.0 的语法变化。这里有一些更改,与您在上面提到的特定错误相关。

  1. 作为 iOS 9 的一部分,Apple 添加了对 Objective-C 的通用支持。这意味着在很多地方,您曾经不得不将来自 NSArray 的内容强制转换为一种类型,以避免在不再需要的地方获得 AnyObject

例如,您在上面使用的 locations 变量曾经是 AnyObject 的数组,现在是 CLLocation 的数组。所以你需要更改此代码:

let locationUpdated = locations.last as! CLLocation

对此:

let locationUpdated = locations.last!
  1. 当您创建一个您不使用的变量时,编译器也能更好地警告您。如果它告诉您一个变量已写入但从未读取过,那正是它的意思。您没有在任何地方使用该变量,可以将其取出。在上一个代码示例中,您应该在 if let 语句的正文中使用 activeFieldPresent 而不是 activeField!。一旦你这样做,关于不使用它的警告就会消失。

在 Swift 2 中声明的许多属性比 Swift 1 中的 AnyObject 更具体。

例如 locations 被声明为 [CLLocation] 所以没有必要再向下转型了。但是您可能必须打开 last 因为它是可选的。

不可变值……从未使用过 是警告,不是错误。它会记住您从未使用过变量 activeFieldPresent,可以用 _(无关紧要)占位符

代替

例如你的代码

if let activeFieldPresent = activeField   // Heres where the error shows
{
    if (!CGRectContainsPoint(aRect, activeField!.frame.origin))
    {
        self.scrollView.scrollRectToVisible(activeField!.frame, animated: true)
    }
}

编译器假设如果你做了一些毫无意义的事情,那么这可能是你这边的错误。 activeFieldPresent 从未使用过,因此 let 毫无意义。你可以直接写 "if activeField != nil"。更好的是

if let activeFieldPresent = activeField
{
    if (!CGRectContainsPoint(aRect, activeFieldPresent.frame.origin))
    {
        self.scrollView.scrollRectToVisible(activeFieldPresent.frame, animated: true)
    }
}

"if let" 不仅会检查可选值是否为 nil,还会为您提供展开后的值。那你为什么不使用它呢? (更好的变量名可能会有用)。