2015-10-05 56 views
-2

因此,我刚刚完成了我的第一个应用程序,使用swift 1.2构建,并为ios 8制作。它上周成功地到达了应用商店,但现在是时候更新代码ios 9和swift 2.swift 2转换帮助 - 89问题

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

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

有没有人有我的工作方式,虽然这个好的建议,让我的应用程序回到它再次工作,但为ios9和swift 2?我应该让Xcode为我转换它并在那里工作吗?我应该改变自己吗?任何帮助都会很棒,因为我仍然对这一切都很陌生。就在我认为我正在研究其中的一部分时,这一切都发生了变化,并且发生了断裂。

一些示例错误我得到如果这能帮助:

  • 很多问题有关不展开选项。我可以解决我认为的问题。

- 这告诉我“Downlocation from'CLLocation?'?到'CLLocation'只解开可选项;你的意思是使用'!'?“不知道在这里做什么。

let locationUpdated = locations.last as! CLLocation 

-variable currentUser被写入,但从来没有读过

var currentUser = PFUser.currentUser() 
  • 永恒价值 'activeFieldPresent' 从未使用;考虑用'_'替换或删除它。用其他不可变的值获得这个错误很多。这是什么意思,我该如何解决?这是为什么我的水龙头类型不工作?

    func keyboardWasShown(notification: NSNotification) 
    { 
    //Need to calculate keyboard exact size due to Apple suggestions 
    self.scrollView.scrollEnabled = true 
    let info : NSDictionary = notification.userInfo! 
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size 
    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0) 
    
    self.scrollView.contentInset = contentInsets 
    self.scrollView.scrollIndicatorInsets = contentInsets 
    
    var aRect : CGRect = self.view.frame 
    aRect.size.height -= keyboardSize!.height 
    if let activeFieldPresent = activeField // Heres where the error shows 
    { 
        if (!CGRectContainsPoint(aRect, activeField!.frame.origin)) 
        { 
         self.scrollView.scrollRectToVisible(activeField!.frame, animated: true) 
        } 
    } 
    

    }

回答

2

我建议你不要使用转换器,通过对自己的错误工作,试图了解从雨燕1.2的语法变化 - >雨燕2.0。以下是一些与上面提到的具体错误相关的更改。

  1. 作为iOS 9的一部分,Apple已经为Objective-C添加了一般支持。这意味着有很多地方你以前必须将一些来自NSArray的东西转换成某种类型,以避免在不再需要的地方获得AnyObject

例如,你使用上面所用的locations变量是AnyObject阵列,并且是现在的CLLocation阵列。所以,你需要更改此代码:

let locationUpdated = locations.last as! CLLocation 

这样:

let locationUpdated = locations.last! 
  • 编译器也得到了在警告你更好,当你创建一个变量你不使用。如果它告诉你一个变量被写入但从不读取,那正是它的意思。你没有在任何地方使用这个变量,并且可以把它拿出来。在上一个代码示例中,您应该在if let语句的主体中使用activeFieldPresent而不是activeField!。一旦你这样做,关于不使用它的警告将消失。
  • +0

    谢谢。另一个问题是,我第一次在我的设备上构建了应用程序的新版本,并且在字段中输入文本对设备非常有用,但不是在模拟器中。所以也许这只是模拟器中的一个错误,希望不是我的代码有问题? – Bcavanaugh934

    +0

    我似乎没有任何问题在我的应用程序模拟器中输入文字。一般而言,我倾向于将这些事情视为代码中的错误(并不是说从来没有SDK问题)。 –

    0

    夫特2个许多属性的声明在夫特1.

    AnyObject更具体的例如locations被声明为[CLLocation]所以就没有必要再向下转换到它。但是您可能需要拆开last,因为它是可选的。

    不可变的值...从来没有使用过是一个警告,而不是一个错误。它会记住你的变量activeFieldPresent从未使用过,并可以由_更换(不关心)占位符

    0

    举个例子你的代码

    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) 
        } 
    } 
    

    的“如果让”不仅检查,一个可选的不为零,它也给你展开的价值。那么你为什么不使用它? (更好的变量名称可能会有用)。