2015-02-25 2 views
1

Так что я пытаюсь вызвать функцию «submitBoilerPlate» в Swift:Swift функция - передать дополнительный объект

var url:String = "https://eamorr.com/ajax/getLatestContent.php" 
var params = [ 
    "hello":"world" 
] 
submitBoilerPlate(url, _params:params, _button:nil) 

А вот соответствующая функция:

func submitBoilerPlate(_url:String, _params:[String: String!], _button:UIButton?){ 
    var oldTitle = _button?.titleLabel?.text 

    _button?.setTitle("Please wait...", forState: UIControlState.Normal) 
    _button?.enabled = false 
    //etc. 
    ... 
} 

Все работает, как ожидалось, когда Я посылаю настоящий UIButton, который объявлен на моем xib.

Однако, я хочу, чтобы иметь возможность отправить кнопку «nil» (этот конкретный xib не имеет кнопки).

Возможно ли это? Или мне нужно создать новую функцию? Я пытаюсь сохранить повторения кода до минимума ...

я получаю следующее сообщение об ошибке во время выполнения, когда код получает submitBoilerPlate (...):

fatal error: can't unsafeBitCast between types of different sizes

ответ

1

Ваша проблема не с UIButton?, а с _params:[String: String!], если вы используете его где-то ниже в функции submitBoilerPlate. Попробуйте заменить его на _params:[String: String]

+0

Это работает! Огромное спасибо. Это только ошибка времени выполнения, когда была отмечена нулевая часть «_button: nil». – Eamorr

+0

@ Eamorr Он решил вашу проблему. Он заслуживает принятого ответа –

+0

Хотя что произойдет, если у меня есть «привет»: world.text', где «world» - это UITextField? world.text возвращает строку! (т. е. не строка) – Eamorr

1

Вставка кода в игровой площадке - это очень хороший способ помочь себе отлаживать. Я взял свой код в мою собственную игровую площадку и нашел следующее для работы:

import UIKit 

func submitBoilerPlate(_url:String, _params:[String: String!], _button:UIButton?){ 
    var oldTitle = _button?.titleLabel?.text 

    _button?.setTitle("Please wait...", forState: UIControlState.Normal) 
    _button?.enabled = false 
} 

var url:String = "https://eamorr.com/ajax/getLatestContent.php" 
var params:[String: String!] = [ 
    "hello":"world" 
] 
submitBoilerPlate(url, params, nil) 

Обратите внимание на явный тип params и удаление ваших _params и _button ошибок в submitBoilerPlate вызова.

Задание params без явного типа приводило к тому, что компилятор не правильно выравнивал ваши биты в соответствии с типом параметра [String: String!].

Имея _params и _button, как часть вашего вызова функции на самом деле является ошибкой. Когда нет места, нет параметров для параметров. Примером может служить альтернатива:

func submitBoilerPlate(_url:String, someParams _params:[String: String!], andButton _button:UIButton?) { 
    // .. same func body 
} 

submitBoilerPlate(url, someParams:params, andButton:nil) 
+0

Привет, спасибо за совет. Попытка порт приложения с Objective-C на Swift здесь ... Все еще на кривой обучения ... – Eamorr

+0

Что я могу сказать о своем ответе, который не решает ваш вопрос, интересно. –

Смежные вопросы