2017-05-16 61 views
0

當我試圖在Swift 3中解析一個簡單的網站時,我遇到了一個問題。我將在網站上找到的所有內容合併在一起,但仍然無法從其他函數中提取loginText,試圖將所有內容放入類中時,實例成員不能用於'type'錯誤。從Swift 3中提取任務的值

import Foundation 
import PlaygroundSupport 
PlaygroundPage.current.needsIndefiniteExecution = true 
extension String { 

    func slice(from: String, to: String) -> String? { 

     return (range(of: from)?.upperBound).flatMap { substringFrom in 
      (range(of: to, range: substringFrom..<endIndex)?.lowerBound).map { substringTo in 
       substring(with: substringFrom..<substringTo) 
      } 
     } 
    } 
} 


var loginText = "" 


func getToken(completionHandler: (String) ->()) { 
    var request = URLRequest(url: URL(string: [MY URL])!) 
    request.httpMethod = "GET" 
    var loginText = "" 

    let sessionConfig = URLSessionConfiguration.default 
    let session = URLSession(configuration: sessionConfig) 
    let task = session.dataTask(with: request) {data, response, err in 
     loginText = (String(data: data!, encoding: String.Encoding.utf8)!) 
    } 
    task.resume() 
} 


func viewDidLoad() { 
    getToken { 
     loginText in 
     loginText.slice(from: "LT", to: "1s1") 
     print("View Controller: \(loginText)") 
    } 
} 

print(viewDidLoad()) 
print(loginText) 

謝謝!

+0

你甚至不調用'completionHandler'在任務的完成處理。錯誤發生在哪裏?請解決這些問題並闡述您的問題。 – ozgur

+0

我很抱歉。我不得不承認,我現在真的不瞭解我正在做的很多事情。我只是試圖通過使用請求來實現我在python中所做的事情,而您在這裏看到的是3小時的試用和manly錯誤的結果。我所要做的就是獲取loginText,以便能夠在getToken()之外使用它。 –

回答

1

我找到了你。

你巧合地使用了錯誤的loginText。

您調用了completionHandler字符串loginText,同時還在函數外聲明瞭loginText。

但你是在正確的道路上。

如果你打電話self.loginText您的問題將得到解決,檢查了這一點:

getToken { 
    loginText in //you named it loginText 
    self.loginText.slice(from: "LT", to: "1s1") 
    print("View Controller: \(loginText)") 
} 

的事情是,這仍然不會被調用。因爲你永遠不會調用completionHandler, - 忘記self.loginText,因爲你有一個只傳遞你的字符串的completionHandler。

使用這個,甚至不改變getToken方法。它會被調用,將正常工作:

let task = session.dataTask(with: request) {data, response, err in 
    let loginText = (String(data: data!, encoding: String.Encoding.utf8)!) 
    completionHandler(loginText) 
} 

另外我想刪除var loginText = ""如果你不想使用它爲gettoken之外。但即使你是,我也會建議只需要一個函數,它接受String,而不是在外面聲明它。但是你知道你爲什麼在外面需要它 - 所以是的。乾杯

編輯:您似乎也缺少@escaping

func getToken(completionHandler: @escaping (String) ->()) {} 
+0

非常感謝!然而我得到一個 錯誤:關閉使用非轉義參數'completionHandler'可能允許它逃脫 當使用completionHandler建議... –

+0

你使用的是swift 3嗎? –

+0

是的!我只是通過在完成處理程序中添加@espacing來解決問題。謝謝 ! –