2016-05-30 13 views
8

Tôi đang cố gắng thực hiện yêu cầu POST trong bản chụp phát triển Swift 3 nhưng vì một số lý do, lệnh gọi tới NSURLSession. dataTask không thành công với các lỗi trong Tiêu đềYêu cầu POST trong ảnh chụp nhanh của Swift 3 cho phép "tham chiếu mơ hồ đến thành viên 'dataTask (với: completionHandler :)'

đây là mã tôi đang sử dụng:.

import Foundation 

var err: NSError? 
var params: Dictionary<String, String> 
var url: String = "http://notreal.com" 

var request = NSMutableURLRequest(url: NSURL(string: url)!) 
var session = NSURLSession.shared() 

request.httpMethod = "POST" 
request.httpBody = try NSJSONSerialization.data(withJSONObject: params, options: []) 
request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
request.addValue("application/json", forHTTPHeaderField: "Accept") 

var task = session.dataTask(with: request, completionHandler: {data, response, err -> Void in 
    print("Entered the completionHandler") 
}) 

task.resume() 

lỗi này là chính xác:

testy.swift:19:12: error: ambiguous reference to member 'dataTask(with:completionHandler:)' 
var task = session.dataTask(with: request, completionHandler: {data, response, err -> Void in 
      ^~~~~~~ 
Foundation.NSURLSession:2:17: note: found this candidate 
    public func dataTask(with request: NSURLRequest, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Swift.Void) -> NSURLSessionDataTask 
       ^
Foundation.NSURLSession:3:17: note: found this candidate 
    public func dataTask(with url: NSURL, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Swift.Void) -> NSURLSessionDataTask 

bất cứ ai có thể cho tôi biết:

  1. Tại sao nó đem lại cho tôi lỗi này
  2. Làm thế nào để thực hiện thành công một yêu cầu POST với các thông số tùy chỉnh trong ảnh chụp phát triển Swift mới nhất sử dụng Foundation chỉ (Tôi không thể sử dụng thư viện của bên thứ ba khác trong mọi trường hợp)

Cảm ơn!

Chỉnh sửa: Tôi lưu ý rằng ai đó đã viết một bản sao của câu hỏi này sau câu hỏi của tôi. Câu trả lời ở đây là câu trả lời hay hơn.

+0

Điều này thật kỳ quặc, tôi không thể thấy tại sao truyền 'NSMutableURLRequest' là mơ hồ. Nó không phải là một phân lớp của 'NSURL', vì vậy IDK làm thế nào nó sẽ nghĩ rằng nó có thể đi vào đó. – Alexander

+0

Đây là những gì tôi đã suy nghĩ. Nó có thể là trường hợp đó là một lỗi, vì nó là ảnh chụp phát triển. –

+0

Bạn có thể cố gắng phân biệt cuộc gọi này bằng cách gán 'dataTaskWithRequest: completionHandler:' vào một biến với chú thích kiểu chỉ định nó là '(NSURL, (NSData ?, NSURLResponse ?, NSError?) -> Swift.Void) -> NSURLSessionDataTask' và sau đó gọi là đóng cửa – Alexander

Trả lời

23

sử dụng URLRequest struct.

Trong Xcode8 sẽ làm việc tốt:

import Foundation 

// In Swift3, use `var` struct instead of `Mutable` class. 
var request = URLRequest(url: URL(string: "http://example.com")!) 
request.httpMethod = "POST" 

URLSession.shared.dataTask(with: request) {data, response, err in 
    print("Entered the completionHandler") 
}.resume() 

Bên cạnh đó, lý do của lỗi này là URLSession API có phương pháp cùng tên, nhưng mỗi mất một lập luận khác nhau.

Vì vậy, API sẽ bị nhầm lẫn mà không có dàn diễn viên rõ ràng. Tôi nghĩ đây là lỗi đặt tên của API.

xảy ra vấn đề này, đoạn mã sau:

let sel = #selector(URLSession.dataTask(with:completionHandler:)) 
2

Xin lưu ý rằng tính Xcode 8.0 phát hành URLSession.shared() sẽ trở thành tài sản và không phương pháp, do đó bạn sẽ phải gọi nó như URLSession.shared.dataTask (với:);

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