В Swift 4 регистр enum с ассоциированным значением Void
больше не эквивалентен регистру enum с пустым списком ассоциированных значений.
Я полагаю, что это, как говорит Мартин , результат SE-0029 , где вы больше не можете передавать кортеж аргументов в функцию и заставлять их «разбрызгиваться» параметры (хотя предложение было помечено как реализованное в Swift 3, я считаю, что этот конкретный случай был раскрыт позже при реализации SE-0110 для Swift 4).
В результате это означает, что вы больше не можете называть (Void) -> T
как () -> T
в Swift 4. Теперь вам нужно явно передать Void
:
let result = Result.success(())
Однако, я мне это кажется довольно уродливым, поэтому я обычно реализую расширение вроде этого:
extension Result where T == Void {
static var success: Result {
return .success(())
}
}
, которое позволяет вам говорить такие вещи:
var result = Result.success
result = .success
Стоит отметить, что этот обходной путь не ограничено перечислимыми случаями, это может также использоваться с методами вообще. Например:
struct Foo {
func bar(_ a: T) {}
}
extension Foo where T == Void {
func bar() { bar(()) }
}
let f = Foo()
// without extension:
f.bar(())
// with extension:
f.bar()
Я считаю, что единственный способ сделать это с помощью общедоступного API - написать собственный пользовательский интерфейс (с этим связаны две ошибки ).
Если вам просто нужно что-то быстрое и грязное, я нашел способ использовать детали реализации для этого ( здесь ):
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
JComboBox box = (JComboBox) e.getSource();
Object comp = box.getUI().getAccessibleChild(box, 0);
if (!(comp instanceof JPopupMenu)) return;
JComponent scrollPane = (JComponent) ((JPopupMenu) comp).getComponent(0);
Dimension size = new Dimension();
size.width = box.getPreferredSize().width;
size.height = scrollPane.getPreferredSize().height;
scrollPane.setPreferredSize(size);
// following line for Tiger
// scrollPane.setMaximumSize(size);
}
Поместите это в PopupMenuListener
и это может работать на вас.
Или вы можете использовать код из первой связанной ошибки :
class StyledComboBoxUI extends BasicComboBoxUI {
protected ComboPopup createPopup() {
BasicComboPopup popup = new BasicComboPopup(comboBox) {
@Override
protected Rectangle computePopupBounds(int px,int py,int pw,int ph) {
return super.computePopupBounds(
px,py,Math.max(comboBox.getPreferredSize().width,pw),ph
);
}
};
popup.getAccessibleContext().setAccessibleParent(comboBox);
return popup;
}
}
class StyledComboBox extends JComboBox {
public StyledComboBox() {
setUI(new StyledComboBoxUI());
}
}
Похоже, вам нужно написать свой собственный ComboBoxUI .
Здесь есть хороший пример , , который показывает, как это сделать.
Также обратите внимание, метод, который вас, вероятно, заинтересует, - это метод createPopup ()
. Это метод, который создает всплывающее окно для поля со списком, где вы можете настроить его.