2017-04-24 87 views
1

什麼是將此Objective-C for-loop轉換爲Swift 3的最好和最乾淨的方法?什麼是最佳做法?我應該使用while循環嗎?Objective-C for循環到Swift 3

NSInteger pageHeight = 792; 
NSInteger pageWidth = 612; 

for (int page=0; pageHeight * page < scrollView.frame.size.height; page++) { 
    // execute some code 
} 

我試圖用東西像這樣工作

for i in pageHeight * i < scrollView.frame.size.height { 
    // execute some code 
} 

,但我不能重用我,因爲它不能被使用的變量。編譯器給出錯誤:未解析的標識符'i'。

編輯:我問這個問題的原因之一是因爲我想具體知道最佳做法是什麼,並避免在循環代碼之前創建一個額外的變量。

回答

2

假設你沒有改變任何環有關變量的循環中,你可以這樣來做:

let pageHeight: Int = 792 
let pageWidth: Int = 612 
let pageCount = Int(scrollView.frame.size.height)/pageHeight 
for page in 0..<pageCount { 
} 
+0

那麼沒有辦法沒有創建一個額外的變量?並感謝你的答案! – KaraBenNemsi

+0

如果您想使用'for'循環,則不需要。但請記住,這比原來的代碼更有效,因爲它僅僅執行一次數學運算,而不是每次循環迭代。 – rmaddy

+1

@KaraBenNemsi:你*可以*擺脫額外的變量:'對於頁面中的0 ..

5

你應該使用while循環:

let pageHeight = 792 
let pageWidth = 612 
var page = 0 
while pageHeight * page < Int(scrollView.frame.size.height) { 
    // execute some code 
    page += 1 
} 
+0

您無法將'Int'與'CGFloat'進行比較。你需要在那裏演員。 – rmaddy

+0

所以沒有辦法沒有創建一個額外的變量?並感謝你的答案! – KaraBenNemsi

+3

@KaraBenNemsi在這個答案中沒有比你原來的OC代碼更多的變量。 – rmaddy

0

由於另一種選擇,這裏是一個遞歸/功能選項:

func setupPages(maxHeight: CGFloat, pageHeight: CGFloat, pageNumber: Int = 0) { 
    guard (pageHeight * CGFloat(pageNumber)) < maxHeight else { 
     return 
    } 
    // do what you need to do 
    setupPages(maxHeight: maxHeight, pageHeight: pageHeight, pageNumber: pageNumber + 1) 
} 
在你的代碼,你可以只是簡單的調用

然後:

setupPages(maxHeight: scrollView.frame.height, pageHeight: CGFloat(pageWidth)) 
+0

雖然這可行,但它不是一個很好的遞歸使用。 – rmaddy