2014-11-04 13 views
16

Wszystko co musisz zrobić, to uruchomić nowy projekt w Swift i dodać do main.swiftinout parametr w zamknięciu awarii Swift kompilator

struct Foo { 
    let bar: (inout baz: String) ->() 
} 

Kiedy próbuję zbudować otrzymuję błąd:
Command failed due to signal: Segmentation fault: 11

Czy robię coś złego?

Pomyślałem, że może inout parametry zamknięć nie są obsługiwane, ale jeśli mogę określić zamknięcie tak:

let baz: (inout baz: String) ->() = { baz in 
    baz += "x" 
    return 
} 

lub nawet

var baz: (inout baz: String) ->()? 

kompiluje i działa OK

+2

Otworzyłem bilet w reporterze błędów jabłek. Myślę, że to błąd. Kompilator Swift jest teraz trochę błędny. – Shuo

+0

W twoim pierwszym przykładzie typ nie może zostać znaleziony przez kompilator. W twoim drugim przykładzie kompilator może znaleźć przyczynę tego, że zdefiniowałeś ją pośrednio. W ostatnim przykładzie jest to opcjonalne, więc istnienie zawsze będzie prawdziwe. – Alex

+0

masz rację; to się nie udaje. –

Odpowiedz

1

Właśnie przetestowałem to w Swift 1.2 dostarczonym z Xcode 6.3 beta, i to zostało skompilowane pomyślnie. To był zdecydowanie błąd kompilatora, który rozwiązali w ostatnim wydaniu:

0

@Bartek Chlebek. W opublikowanym przez ciebie kodzie jest jedna niejednoznaczna rzecz (pogrubiona): "niech pasek: (inout baz: String) ->()". Definiując taką funkcję, mówisz kompilatorowi, że zwrócisz pustą krotkę. Wygląda na to, że wcześniejsze wersje kompilatora nie rozróżniały (muszą być błędem w mechanizmie wnioskowania typu) typu Void i "pustego typu krotki" (oznaczonego "()"). Oto kilka słów na temat składni krotek: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html#//apple_ref/doc/uid/TP40014097-CH31-ID448

Możliwe rozwiązanie: jednoznacznie określić typ wartości zwrotu (która jest „Void” w danym przypadku). Mam nadzieję że to pomoże.