2015-01-10 2 views
4

У меня есть массив (String,Bool) кортежей:Странного Bool из управления пользовательского интерфейса

var names : [(name:String, important:Bool)] = [("Paul",true), ("Peter",false)] 

У меня также есть UISwitch контроля:

@IBOutlet weak var importantSwitch: UISwitch! 

Я хочу добавить к массиву, используя состояние переключателя для определения Bool.

Следующая делает не работы:

names.append(name: "whatever", important: importantSwitch.on) 

Вопрос сообщает XCode является "тип T не соответствует протоколу IntegerLiteralConvertible".

Они делают работу:

let i : Bool = importantSwitch.on 
names.append(name: "whatever", important: i) 

или

names.append(name: "whatever", important: importantSwitch.on==true) 

Мой вопрос, по сути, является, почему?

+0

Массивы с кортежами по-прежнему странны в Swift, см. Http://stackoverflow.com/questions/24539679/how-do-i-create-an-array-of-tuples для аналогичного примера. Определение псевдонима типа также может помочь здесь. (Это не отвечает на вопрос «почему».) –

+0

@MartinR Хорошо, я думаю, что захватил «почему». – matt

ответ

2

Простое и сытное перезапись бросить:

names.append(name: "whatever", important: importantSwitch.on as Bool) 

Еще лучше, если вы не хотите, чтобы выполнить любой произнесении или назначения танец, а затем использовать extend вместо append:

names.extend([(name: "whatever", important: importantSwitch.on)]) 

Как сказал Мартин Р., псевдоним типа также решает его, поскольку он позволяет получить конструктор в явном виде:

typealias Pair = (name:String, important:Bool) 
var names = [Pair]() 
names.append(Pair(name: "whatever", important: importantSwitch.on)) 

Я думаю, что факт, что extend работает напрямую, и append не показывает, в чем проблема: это синтаксис кортежа. Проблема в том, что, хотя это малоизвестный факт - список параметров функции и, следовательно, список аргументов в вызове функции, это сам фактически кортеж.

Таким образом, когда вы говорите names.append(...), это то, в круглых скобках список аргументов - вы пытаетесь вызвать append, как будто он назвал параметры name: и important: - или это сам кортеж, который вы хотите добавить ? Свифт знает, что это массив кортежей и пытается его обработать, но он нуждается в некоторой помощи. Вы могли бы подумать, что мы сможем решить это с помощью дополнительного набора круглых скобок, но такой удачи нет; Я думаю, это связано с тем, что несколько вложенных парнов не имеют смысла (они отбрасываются на один набор парнеров в начале процесса синтаксического анализа). Однако с extend мы можем написать литерал массив с буквальным кортежем внутри него, и нет никакой двусмысленности. Типалиас и конструктор одинаково однозначны.

+2

Но это на самом деле не отвечает на его вопрос. Документация 'UISwitch' сообщает' '' '' Bool''.Зачем вам нужно повторять это как то, что оно есть? – mbm29414

+1

Такая же проблема возникает, если вы замените UISwitch обычным чистым классом Swift с свойством 'var on: Bool'. Так что это *** не *** проблема BOOL-> Bool или Objective-C-> Swift. –

+0

Я согласен с тем, что ошибка указывает на то, что это не «Bool», но нет способа узнать, что из документации, которая, как представляется, указывает на то, что это поведение является ошибкой. Если Apple заявит, что это «Bool», но на самом деле это что-то еще за кулисами, которое не будет действовать как «Bool», это плохое программирование. – mbm29414

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