2015-10-05 69 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) 
        } 
    } 
    

    的「如果讓」不僅檢查,一個可選的不爲零,它也給你展開的價值。那麼你爲什麼不使用它? (更好的變量名稱可能會有用)。