2012-05-23 2 views
2

Поскольку RubyMotion, похоже, делает много преобразования типов во время компиляции, у меня возникли проблемы с передачей правильного типа данных в запрос NSMutableURLRequest POST. Он ожидает NSData, но я не могу понять, как ввести переменную NSString в NSData, не вызывая ошибки. Без typecasting наш SOAP-сервер не может должным образом получать данные, и я получаю страшный (и неопределенный) «Данные на корневом уровне недопустимы. Ошибка линии 1, позиция 1».RubyMotion >> Как добавить переменную как отдельный тип?

Это проблематично линия:

postXML = "<xml><whatever>hey</whatever></xml>" 
postData = (postXML as NSData).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true); 

request = NSMutableURLRequest.alloc.init 
request.setURL(NSURL.URLWithString("https://services.sbx1.cdops.net/v4.3/SubscriberServicePox.svc/Login")) 
request.setHTTPMethod("POST") 

request.setValue("application/xml", forHTTPHeaderField: "Content-Type") 
request.setHTTPBody(postData, dataUsingEncoding:NSUTF8StringEncoding) 

theConnection = NSURLConnection.alloc.initWithRequest(request, delegate:self) 

Любая помощь будет оценена.

+0

'(postXML as NSData)' должен быть просто 'postXML' без точки с запятой в конце, но в противном случае ваш код не будет вызывать никаких ошибок для меня, и если я проверю' request.HTTPBody', это ' Объект NSConcreteMutableData', а не 'NSString'. Какая конкретная часть вашего кода бросает ошибку? –

+0

Насколько явные преобразования типов идут, кажется, RubyMotion обрабатывает все это для вас. Вызов метода NSData на качестве NSString эффективно типов его соответствующим образом: Перед loginPostXML = (loginPostXML как NSData) .dataUsingEncoding (NSUTF8StringEncoding, allowLossyConversion: истинный); После loginPostXML = loginPostXML.dataUsingEncoding (NSUTF8StringEncoding, allowLossyConversion: true) Простое решение, но тип-неопределенность все еще остается (к сожалению). – cnp

+0

'dataUsingEncoding' - это стандартный способ преобразования NSString в NSData. Вы говорите, что просто использование 'loginPostXML.dataUsingEncoding ...' делает или не исправляет его для вас? Если да, я могу добавить его в качестве официального ответа. –

ответ

2

Ваше понимание того, что происходит, имеет некоторые отверстия, поэтому давайте сломаем его.

postXML = "<xml><whatever>hey</whatever></xml>" 
postData = (postXML as NSData).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true); 

Я не знаю, где вы получили (postXML as NSData) от но не действует и не имеет никакого смысла. dataUsingEncoding:allowLossyConversion: - это метод Objective-C, указанный на NSString не NSData. Правильный способ назвать это было бы, как это

postData = postXML.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) 

движение Рубин не делает type conversions для вас, Ruby нет и Objective-C не делает. Если вы отправляете сообщение экземпляру класса, который не отвечает на сообщение, которое вы его отправили, вы будете вызывать/возбуждать исключение.

Когда вы звоните

postXML.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) 

вы не делаете отливку типа, вы отправляете сообщение dataUsingEncoding:allowLossyConversion: к экземпляру NSString. Это приведет к возврату нового совершенно нового объекта (экземпляр NSData).

+0

Я должен был быть яснее; (var as Type) - это соглашение, используемое на других языках, и я надеялся, что это лучше проиллюстрирует вопрос кастинга, но да, ваше объяснение имеет смысл - очень ценится. – cnp