2016-10-21 24 views
14

Tôi rất mới với Swift.Chuyển đổi dữ liệu thành chuỗi trong Swift 3

Tôi muốn tạo một cái gì đó như API trên Swift cho ứng dụng giáo dục của mình.

tôi có mã này:

static func getFilm(filmID: Int) -> String { 

    print("getFilm") 

    let url = URL(string: "https://api.kinopoisk.cf/getFilm?filmID=\(filmID)")! 
    var request = URLRequest(url: url) 

    var returnData: String = "" 

    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     if var responseVar = response, var dataVar = data { 
      print(responseVar) 
      returnData = String(data: dataVar, encoding: .utf8) 
     } else { 
      print(error) 
     } 
    } 

    task.resume() 

    return returnData 
} 

Và tôi cố gắng để chuyển đổi dữ liệu để String trong dòng này: returnData = String(data: dataVar, encoding: .utf8)

Swift trình biên dịch mang lại cho tôi một lỗi, và thay đổi dòng này để returnData = String(data: dataVar, encoding: .utf8)! , khi Tôi thực hiện dòng này tôi nhận được biến returnData trống.

Nếu tôi sử dụng dòng ví dụ cơ bản print(String(data: data, encoding: .utf8)) mọi thứ sẽ ổn và tôi có thể thấy data trong bảng điều khiển XCode.

Vì vậy, làm cách nào tôi có thể chuyển đổi Dữ liệu thành chuỗi?

+0

Vấn đề chính là bạn không thể trả lại nội dung nào đó từ chức năng không đồng bộ. Bạn cần một trình xử lý hoàn thành. – vadian

+0

@vadian Xin vui lòng, bạn có thể chuyển đổi mã của tôi để xử lý hoàn thành mã? Tôi đọc rất nhiều về họ và tôi không hiểu những gì tôi cần để tách biệt trong mã của tôi. – IlyaGutnikov

+0

Tôi đã viết một câu trả lời. – vadian

Trả lời

21

Đây là một ví dụ sử dụng một trình xử lý hoàn thành:

class func getFilm(filmID: Int, completion: @escaping (String) ->()) { 
    let url = URL(string: "https://api.kinopoisk.cf/getFilm?filmID=\(filmID)")! 

    URLSession.shared.dataTask(with:url) { (data, response, error) in 
     if error != nil { 
     print(error!) 
     completion("") 
     } else { 
     if let returnData = String(data: data!, encoding: .utf8) { 
      completion(returnData) 
     } else { 
      completion("") 
     } 
     } 
    }.resume() 
} 

Và bạn gọi nó

MyClass.getFilm(filmID:12345) { result in 
    print(result) 
} 

Trong trường hợp của một lỗi xử lý hoàn trả về một chuỗi rỗng.

MyClass là lớp kèm theo của phương thức getFilm. Rất có thể dịch vụ web sẽ trả về JSON, vì vậy bạn có thể cần phải deserialize JSON thành một mảng hoặc từ điển.


Trong một phiên bản tinh vi hơn tạo ra một enum với hai trường hợp và giá trị đi kèm

enum ConnectionResult { 
    case success(String), failure(Error) 
} 

Với một chút nỗ lực nhiều hơn thể hiện sức mạnh tinh tế của Swift bạn có thể trở lại một trong hai chuỗi chuyển định dạng về thành công của lỗi trên thất bại trong một đối tượng duy nhất.

class func getFilm(filmID: Int, completion: @escaping (ConnectionResult) ->()) { 
    let url = URL(string: "https://api.kinopoisk.cf/getFilm?filmID=\(filmID)")! 

    URLSession.shared.dataTask(with:url) { (data, response, error) in 
     if error != nil { 
     completion(.failure(error!)) 
     } else { 
     if let returnData = String(data: data!, encoding: .utf8) { 
      completion(.success(returnData)) 
     } else { 
      completion(.failure(NSError(domain: "myDomain", code: 9999, userInfo: [NSLocalizedDescriptionKey : "The data is not converible to 'String'"]))) 
     } 
     } 
    }.resume() 
} 

Tuyên bố switch phân tách các trường hợp.

MyClass.getFilm(filmID:12345) { result in 
    switch result { 
    case .success(let string) : print(string) 
    case .failure(let error) : print(error) 
    } 
} 
+0

Cảm ơn bạn rất nhiều! – IlyaGutnikov

+0

Xin lỗi, nhưng tôi không hiểu, làm thế nào tôi có thể nhận được giá trị trả về từ getFilm? Tôi có nghĩa là một cái gì đó như thế này 'var test = getFilm()' – IlyaGutnikov

+0

'MyClass.getFilm (filmID: 12345) {kết quả của bạn trong in (kết quả) }' chỉ thổi tâm trí của tôi. Tôi nghĩ rằng nó sẽ đơn giản - tôi có chức năng với các tham số đầu vào và đầu ra, và tôi hiểu làm thế nào tôi có thể nhận được 'kết quả' trong mã bên ngoài. – IlyaGutnikov

Các vấn đề liên quan