Swift Xcode Index zawiesza się lub spowalnia

101

Może to tylko ja doświadczam takiej irytującej „funkcji”:

Po aktualizacji z Xcode 6.0.1 do Xcode 6.1 sytuacja uległa zmianie. Xcode 6.1 zawsze indeksuje projekt lub kompiluje pliki źródłowe. Projekt nie jest duży. Po prostu zawiera kilka plików Swift i AWS SDK 2.0 Cocoapods w obszarze roboczym. Myślę, że nie powinno to uniemożliwiać indeksowania i płynnej kompilacji całości. Próbowałem z kilkoma próbkami aws-sdk-ios-sampli, żeby zobaczyć, jak działa na nich Xcode 6.1, i skończyło się na tym samym czekaniu.

Jakie rozwiązania wypróbowałem do tej pory:

  1. Usuwanie „danych pochodnych” w Organizatorze i ponowne otwarcie obszaru roboczego. (nie można naprawić)
  2. „Pokaż zawartość pakietu” w pliku .xcodeproj i usuwanie .xcworkspace jak w ( Xcode 4 - niska wydajność )

Żaden z nich niestety nie zadziałał.

PS Może powinienem spróbować odtworzyć projekt? Ustawienia mojego komputera: MacBook Pro (Retina, 13-calowy, połowa 2014 r.), Pamięć 8 GB 1600 MHz DDR3, z Yosemite. (Myślę, że to wystarczy do uruchomienia tego małego projektu.)

leonard
źródło
Podobne doświadczenia? Tak: wieczne indeksowanie Xcode beta 3 Swift
zisoft
2
Nie będę zbyt pomocny, ale robię ... Po prostu pozwalam xcode 6.x zająć trochę czasu. Jeśli z tym walczę, to mnie wkręca, więc po prostu czekam, aż uruchomi się xcode 6. Pozwoliłem mu działać, to głupie indeksowanie. Następnie osobno uruchamiam symulator iOS i czekam, aż pojawi się głupia trampolina. Wreszcie, kiedy prowadzę projekt, przeoczam fakt, że indeksowanie wielokrotnie mówi „Wstrzymano” i modlę się do <# godObject #>, piję kawę i próbuję wejść w tryb zen. Ale * westchnienie *, to szorstkie: / i naprawdę polubiłem xcode 5.1.1: |
staticVoidMan
Ta odpowiedź zadziałała dla mnie: stackoverflow.com/a/33395844/242933
ma11hew28

Odpowiedzi:

72

Wypróbowałem wiele z powyższych sugestii, w tym dzielenie plików, instalowanie Xcode 6.2 beta i łamanie instrukcji konkatenacji ciągów. Ostatecznie udało mi się podzielić tablicę literalnych deklaracji słowników, których używałem do testowania danych, na wiele .appendinstrukcji.

// This causes indexing/building to hang...
var test = [ [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ] ]

// This works fine.
var test = [ [ "a": false, "b": "c" ] ]
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])

Poza tym, co jest warte, szósty wpis w tej tablicy jest przyczyną problemu; pięć działa dobrze.

Zen
źródło
To samo rozwiązanie działało u mnie ze słownikiem. Zainicjowanie go bezpośrednio spowodowało trwające indeksowanie. Inicjalizacja init()krok po kroku działa idealnie. Warto wspomnieć, że musiałem też usunąć .xcworkspaceplik.
jboi
Naprawiłem to dla mnie bez użycia słowników. Po prostu tablica krotek, która była w porządku z 8 elementami w deklaracji. Musiałem wrócić do dołączania z 11 elementami. Nie zawracałem sobie głowy znalezieniem dokładnego punktu zerwania, ale buduje się 10x szybciej. Xcode w wersji 6.1.1 (6A2008a) na Mavericks.
Josh
Trafiłem na problem z dokładnie 6 elementami. 5 było w porządku.
Justin Lau
Czy jest to problem z XCode czy z kompilatorem?
Sljux
4
Doświadczyłem tego w Xcode 7.3 z literałem tablicowym składającym się z 229 elementów. Zamiast go rozbijać, dodałem deklarację typu, zamiast pozwolić Swiftowi wywnioskować typ. Po tym, jak to zrobiłem, zadziałało.
Brigham
34

Jedynym działającym rozwiązaniem dla mnie jest usunięcie wszystkich danych pochodnych (nie tylko dla bieżącego projektu, po prostu wyczyszczenie całego folderu), a następnie ponowne uruchomienie Xcode.

  1. Otwórz plik / preferencje w Xcode

  2. Kliknij Lokalizacje po prawej stronie wyskakującego okienka

  3. Kliknij ikonę małej strzałki obok „/Users/Mac/Library/Developer/Xcode/DerivedData"..... przeniesie Cię do folderu Xcode, który zawiera folder DerivedData (który zawiera wszystkie dane pochodne z Twoich poprzednich projektów .)

  4. USUŃ folder DerivedData

Remy Cilia
źródło
1
@TravisM. Czy postępowałeś zgodnie z instrukcjami? Jeśli przejdziesz do Okna, Organizatora, Projekty, Usuń pochodne dane, to nie zadziała. Musisz przejść przez Preferencje.
ericgu
@ericgu Tak, ale to nie zadziałało. Naprawiłem mój problem, ale był on związany z inicjalizacją słownika z zakodowanymi danymi za jednym razem. Kiedy przeniosłem kod, aby dodać zakodowane na stałe dane po jednym wierszu na raz, problemy z zawieszaniem się / spowolnieniem natychmiast zniknęły.
Travis M.
Folder w ~ / Library / Developer / Xcode / DerivedData / na moim komputerze. Możesz go również znaleźć, przechodząc do Okno> Projekty w Xcode.
Suragch
Dzięki. To pomaga. Problem „indeksowania na zawsze” zaczyna się zaraz po zaktualizowaniu wersji cocoaPod i wykonaniu instalacji poda.
WKL,
11

Czy używasz CocoaPods? Dzisiaj natknąłem się na ten sam problem. (Przy użyciu xCode 6.1.1)

Aby rozwiązać ten problem, usunąłem wszystko w ~/Library/Developer/Xcode/DerivedData, Podsfolder w katalogu mojego projektu i <project>.xcworkspace.

Następnie otworzyłem terminal, przeszedłem do katalogu mojego projektu i uruchomiłem pod installponownie.

Michael Schinis
źródło
1
Tak. Na razie Xcode zachowuje się dobrze. Ale nadal od czasu do czasu powoduje błąd awarii zestawu sourcekit. Moim rozwiązaniem jest usunięcie folderu danych pochodnych.
Leonard
Cieszę się, że to zadziałało również dla kogoś innego :). Wygląda na to, że xCode próbuje indeksować biblioteki CocoaPod i gdzieś utknie.
Michael Schinis
1
Usunięcie folderu Pods i pliku <project> .xcworkspace, a następnie ponowne uruchomienie instalacji pod działało.
KML
9

Miałem dziś ten sam problem. Xcode 6.3.2, średni projekt Swift. W pewnym momencie zaczął indeksować i nigdy nie kończył indeksowania. Kod, który to spowodował, był słownikiem typu [String: [String]], a więc dict-key z tablicami łańcuchowymi jako wartościami. Miałem dwa z nich z kluczami od A do Z, a każdy z tych 26 wpisów zawiera tablicę ciągów z 5 do 10 ciągami.

Wyczyszczenie danych pochodnych nie pomogło. Dopiero wykomentowanie tych nakazów sprawiło, że to się powtórzyło.

Szczerze mówiąc, to śmieszne! Apple musi naprawić Xcode! Kompilacja projektów Swift jest już okropnie powolna, ale takie błędy są powstrzymywane. Nie mogę z tym prawidłowo wykonywać swojej pracy!

BadmintonCat
źródło
6

Dla tych, którzy nadal mają ten problem, jest to obejście, które mi się podobało, które zapobiega konieczności wchodzenia do obiektów jeden po drugim:

// instead of this, which freezes indexing
let keys = [keyQ, keyW, keyE, keyR, keyT, keyY, ... keyM]    

// and instead of this, which is ugly & lengthy
var keys = [KeyboardKey]()
keys.append(keyQ)
keys.append(keyW)
...
keys.append(keyM)

// use this:
var keys = [KeyboardKey]()
keys.appendContentsOf([keyQ, keyW, keyE, keyR, keyT, keyY, ... keyM])
Andrew Robinson
źródło
1
Wow ... Miałem dokładnie ten sam problem. Dzięki! Zgłosiłem to jako błąd do Apple. Robienie tego, co powiedziałeś, nie działa dla mnie. Musiałem podzielić moją długą tablicę na mniejsze tablice, z których każda zawierała pięć lub mniej elementów.
ma11hew28,
5

Dla mnie próbowałem wszystkich powyższych bez powodzenia; ale wszystko, co musiałem zrobić, to usunąć folder danych pochodnych, następnie otworzyć inny losowy projekt, poczekać, aż się zindeksuje i teraz mój oryginalny (nieprawidłowo działający) projekt działa!

Zrób światu programistów przysługę i uczyń swoje szybkie kompilatory open source - więc nie wszyscy jesteśmy powstrzymywani przez twoją niekompetencję.

Gmeister4
źródło
3

Używam Xcode w wersji 7.3 (7D175)

Myślę, że mogłem znaleźć podstawowy problem. Tam, gdzie utknąłem w fazie indeksowania, w dwóch przypadkach:

  • Stworzyłem zamknięcie, które przypisałem do zmiennej i pominąłem sygnaturę typu. Myślę, że xcode miał problemy z tym krokiem wnioskowania typu. Jeśli dobrze pamiętam, jednym z argumentów był CGPoint, który ma przeciążony konstruktor. Moja hipoteza jest taka, że ​​istnieje zbyt wiele możliwości tego, co moje zamknięcie mogłoby zaakceptować jako argumenty.

  • Refaktoryzowałem metodę fabryczną w taki sposób, że zamiast zwracać wystąpienia jednego typu, mogłaby zwrócić wystąpienia wielu typów ze wspólną klasą bazową. Wygląda na to, że gdziekolwiek użyłem metody fabrycznej, musiałem rzutować wynikowy obiekt na określony typ (za pomocą as? Lub przypisując go do zmiennej, która akceptuje określony typ). Ponownie krok wnioskowania o typie wydaje się być uszkodzony.

Wydaje się, że to samo dzieje się z deklaracjami słownikowymi, o których wspominali wcześniejsi ludzie. Złożyłem raport o błędzie w Apple.

DudeOnRock
źródło
2

Ten sam problem wystąpił po aktualizacji do wersji 6.1. Xcode utknąłby podczas kompilacji lub indeksowania bez generowania określonego komunikatu o błędzie.

Problem został ostatecznie rozwiązany przez rozbicie niektórych dłuższych wyrażeń w szybkich plikach na wiele krótszych wyrażeń. Część mojego programu łączy wiele różnych zmiennych łańcuchowych, tworząc dłuższy ciąg. Próby połączenia ich w jednym wyrażeniu i użycie operatora przypisania dodawania nie powiodły się. Udało mi się to zrobić, wykonując coś podobnego do następującego (uproszczone):

var a = "Hello"
var b = " "
var c = "World"
var d = "!"
var partA = a + b
var partB = c + d
var result = partA + partB

Wpadłem na ten pomysł, ponieważ wielokrotnie otrzymałem następujący błąd w poprzedniej wersji Xcode „Wyrażenie było zbyt złożone, aby można było je rozwiązać w rozsądnym czasie; rozważ podzielenie wyrażenia na odrębne wyrażenia podrzędne”.

Mam nadzieję że to pomoże

Adam 137
źródło
Tak, dzięki, faktycznie skorzystałem z tego rodzaju sugestii. Skróciłem też długość jednego z moich plików z 1500 linii do około 1200. I oczywiście stworzyłem nowy projekt i zaimportowałem do niego wszystkie pliki jeden po drugim. W końcu wraca. Nie jestem pewien, który z nich jest największym zbawcą.
leonard
Rozszczepienie długiego wyrazu twarzy w Szybkim załatwiło mi sprawę.
MandisaW
2

Zmagałem się z tym samym problemem. Wypróbowałem dwa wymienione rozwiązania (usuwanie danych pochodnych i usuwanie .xcworkspace) bez powodzenia. Próbowałem też powoli komentować większość kodu krok po kroku i usuwać pliki, aż prawie nic nie zostało, a indeksowanie nadal się blokowało.

Znalazłem rozwiązanie, które dla mnie zadziałało, otworzyłem projekt ze starszą wersją Xcode 6.1 (6A1030), która nie miała problemu z indeksowaniem, a następnie wróciłem do najnowszej wersji Xcode 6.1 (6A1052d), której używałem wcześniej, a indeksowanie było naprawiony i nadal działa dobrze.

Mój wniosek jest taki, że jest to błąd w Xcode w wersji 6.1 (6A1052d), który, mam nadzieję, poprawi się w przyszłych wydaniach.

Problem wraca raz na jakiś czas, za każdym razem działa ta sama poprawka. Myślę, że innym rozwiązaniem byłoby po prostu trzymanie się starszej wersji Xcode 6.1 (6A1030), ale nie będzie działać z urządzeniami z systemem iOS 8.1 i nie będzie miało najnowszych poprawek.

Jorge Costa
źródło
Wypróbowałem większość sugestii dotyczących rozwiązania problemu z wiecznym indeksowaniem i była to jedyna, która działała dla mnie. Nie miałem starszego Xcode 6, ale miałem Xcode 5. Nie mógł się skompilować, ale zindeksował i po pomyślnym zindeksowaniu Xcode 6.1.
SarahR
Zapomniałem wspomnieć, że było to tylko tymczasowe rozwiązanie i musiałem to powtórzyć kilka godzin później.
SarahR
2

Próbowałem tego z Xcode 8.3.3. Oto moje wyniki:

Możesz napisać doskonale dobry kod Swift, który spowoduje zawieszenie indeksowania.

Gdy indeksowanie się zawiesza, zawiesza się. Zmiana kodu Swift z powrotem na coś, co nie spowodowałoby zawieszenia się indeksowania, nie pomaga, nadal się zawiesza.

Zamknięcie projektu i ponowne otwarcie nie pomaga w tej sytuacji.

Pomaga zamknięcie Xcode i ponowne uruchomienie. Indeksowanie nie będzie się już zawieszać (to znaczy, jeśli zmienisz kod z powrotem na coś, co go nie zawiesza).

Ponowne uruchomienie komputera Mac również pomaga, chociaż nie jest potrzebne.

Zawieszanie jest spowodowane doskonale precyzyjnym kodem Swift. Przykład, jak wyglądałem

if let date = function1()
?? function2()
?? function3()
?? function4()
?? function5()
?? function6()
?? function7()
?? function8()
?? function9()
?? function10() {
    return date
}

Indeksowanie zawiesiłoby się. Skomentowałem większość „??” linie i było dobrze (po zamknięciu i ponownym uruchomieniu Xcode). Odkomentowano jeden wiersz po drugim. Przy pewnej liczbie wierszy było dobrze, a odkomentowanie następnego wiersza spowodowałoby zawieszenie się.

Jedyną rzeczą, która najwyraźniej pomaga, jest zmiana kodu.

gnasher729
źródło
2

W moim Xcode rozwiązaniem było zamknięcie wszystkich zbędnych okien. Z jakiegoś powodu wiele otwartych okien powoduje, że Xcode jest bardzo powolny.

Arik Halperin
źródło
dla mnie to też było rozwiązanie, zaskakujące, ponieważ działało dobrze przez długi czas z taką samą liczbą otwartych okien
Christian
1

Wreszcie „rozwiązałem” problem, chociaż jest to tylko obejście.

Stworzyłem kolejny projekt i po kolei dodawałem do niego pliki. Wtedy zauważyłem „bardzo długi” plik viewcontroller.swift. Następnie rozbiłem jego kody na moduły i zamieniłem te wielokrotnie używane kody na funkcje w innym szybkim pliku. A także skorzystałem z sugestii online, że długie wyrażenie powinno zostać podzielone na krótsze. Następnie działa indeksowanie i kompilacja.

Więc na razie mam to „rozwiązane”.

ALE, nie sądzę, żeby to było w porządku. Środowisko Xcode IDE powinno być więcej niż zdolne do obsługi mojego „bardzo długiego” pliku szybkiego, tylko 1500 linii. Uważam, że jest to zdecydowanie błąd (istniejący od dawna), chociaż Xcode 6.1 jest już aktualizacją z Xcode 6.0.1.

leonard
źródło
1

W moim przypadku usunąłem aplikację Xcode, pobrałem ją ponownie i zainstalowałem. To rozwiązało problem, przynajmniej teraz.

Tzegenos
źródło
1

Indeksowanie Xcode zwykle dla twojego kodu w celu uzyskania sugestii i automatycznego uzupełniania, między innymi pomoc w tworzeniu scenorysów i odwrotnie. Ale aby przyspieszyć projekt xcode, możesz go wyłączyć / włączyć za pośrednictwem terminala

Wyłącz indeksowanie
domyślne ustawienia napisz com.apple.dt.XCode IDEIndexDisable 1 Włącz domyślne indeksowania zapisuj com.apple.dt.XCode IDEIndexDisable 0

Ale lepsze podejście do korzystania z szybkiego Maca z dobrą pamięcią RAM.

Ballu
źródło
2
Wyłączenie indeksowania poważnie kaleczy Xcode i nie powinno być wykonywane. Polecenie komuś zakupu nowego Maca nigdy nie powinno być odpowiedzią, dwuletni laptop powinien być w stanie obsłużyć najnowszy Xcode.
Knight0fDragon
macOS 10.13 Beta 7 wprowadził coś, co powoduje awarię zarówno Xcode 9 Beta 6, jak i Xcode 8, gdy tylko uruchomi się indeksator. Wyłączenie go było jedynym sposobem na dalsze używanie Xcode, nawet z uszkodzoną wersją.
Pegolon
1

Xcode 11.5 (11E608c) i nadal te same problemy, 6 lat po pierwotnym pytaniu. Chciałbym móc „zaznaczyć” jabłko w tym pytaniu, żeby mogli zobaczyć ten bałagan. Jest to duży projekt (> 1000 plików) i byłem pod zegarem, więc kiedy zauważyłem zamarzający indeks, zmieniłem ponad 100 plików i nie mogę wrócić.

Próbowałem wszystkiego:

  1. wyczyść dane pochodne i kompiluj
  2. Uruchom ponownie Xcode, uruchom ponownie Maca
  3. usuń i dodaj źródło
  4. Szukano słowników dosłownych itp. Itp

Problem polegał na utworzeniu tablicy:

private var overlayColors: [UIColor] = [UIColor(hex: "#b71c1c"), UIColor(hex: "#4a148c"),
                                        UIColor(hex: "#880e4f"), UIColor(hex: "#1de9b6"),
                                        UIColor(hex: "#f50057"), UIColor(hex: "#311b92"),
                                        UIColor(hex: "#f44336"), UIColor(hex: "#651fff"),
                                        UIColor(hex: "#d500f9"), UIColor(hex: "#3d5afe"),
                                        UIColor(hex: "#bf360c"), UIColor(hex: "#0d47a1"),
                                        UIColor(hex: "#006064"), UIColor(hex: "#2979ff"),
                                        UIColor(hex: "#ff6f00"), UIColor(hex: "#1a237e"),
                                        UIColor(hex: "#795548"), UIColor(hex: "#004d40"),
                                        UIColor(hex: "#00e676"), UIColor(hex: "#01579b"),
                                        UIColor(hex: "#33691e"), UIColor(hex: "#827717"),
                                        UIColor(hex: "#76ff03"), UIColor(hex: "#ffc400"),
                                        UIColor(hex: "#e65100"), UIColor(hex: "#00b0ff"),
                                        UIColor(hex: "#ff3d00"), UIColor(hex: "#616161"),
                                        UIColor(hex: "#263238"), UIColor(hex: "#ff1744")]

To, co pomogło mi odkryć zły plik Swift, to kiedy xcode zawiesił indeksowanie, wykonałem następujące kroki

  1. otwórz monitor aktywności -> „szybki” proces -> pokaż informacje o procesie -> otwórz pliki i porty. Spowoduje to wyświetlenie listy plików uruchomionych przez ten proces, analizując listę możliwych złych plików
  2. Innym przydatnym narzędziem jest ten skrypt, SOURCEKIT_LOGGING=3 /Applications/Xcode.app/Contents/MacOS/Xcode &> ~/Documents/xcode.logktóry uruchomi Xcode z pełnym poziomem 3 i rozpocznie rejestrowanie w pliku dziennika.
  3. Wyszukaj w pliku dziennika ostatnie wpisy plików Swift, np. „Moj_projekt / źródło / aplikacja /”

Nie jest to pełne rozwiązanie, ale warto przeanalizować i wiedzieć, gdzie szukać.

otwórz monitor aktywności -> „szybki” proces -> pokaż informacje o procesie -> otwórz pliki i porty.

Ognista pułapka
źródło
0

Jeśli nie masz nic przeciwko powracaniu do wersji 6.0.1, dopóki tego nie wymyślą, to właśnie zadziałało. Miałem ten sam problem z 6.1 i 6.1.1. Teraz jestem dobry. Spróbuję 6.2, kiedy wyjdzie.

Poprzednie wersje oprogramowania Apple można znaleźć na ich oficjalnej stronie dla programistów, tutaj: https://developer.apple.com/downloads/index.action

Jeśli to zrobisz, najpierw usuń bieżącą kopię Xcode.

JeremyGranger
źródło
0

Używam Xcode 6.1.1 z szybkimi plikami na tym samym, dokładnym MacBooku Pro.

Kiedy dodawałem wiersze do tablicy ciągów 3D, Xcode nagle stał się bezużyteczny i teraz nie mogę nic zrobić.

Spróbuje powrócić do wersji 6.1 i miejmy nadzieję, że problem zniknie.

gardner888
źródło
Mam ten sam problem. Po dodaniu szeregu słowników xcode stał się bezużyteczny ... Czy znalazłeś rozwiązanie?
Almazini,
Wróciłem do Xcode 6.1, który działał lepiej. Indeksowanie nie utknęło na zawsze, ale czasami pisałem i otrzymywałem piłkę plażową na 4 sekundy. Ogólnie byłem w stanie napisać wystarczająco dużo kodu, aby zrobić rzeczy. Nie zmieniłem żadnego kodu. Chociaż w Xcode 6.1 bateria MacBooka Pro nie wydawała się zbyt dotknięta, ale na moim Macbooku Air z połowy 2013 roku z 6.1.1 żywotność baterii jest absolutnie krótka. Po uruchomieniu Xcode mija od ~ 12 godzin do 2 godzin.
gardner888
0

Widzę to w Xcode 6.3.2. Naprawdę miałem nadzieję, że rok po wydaniu kompilator będzie działał, ale niestety.

Jeśli żadne z powyższych rozwiązań nie działa, spróbuj sprawdzić kod pod kątem błędów składniowych. Podczas refaktoryzacji wyodrębniłem zamknięcie, ale zapomniałem zakwalifikować parametrów:

    let hangsInsteadOfError = { l, r in
        return l.nameFirst < r.nameFirst
        || l.nameFirst == r.nameFirst && l.nameLast < r.nameLast }

    let fixingErrorAvoidsHang = { (l:User, r:User) -> Bool in
        return l.nameFirst < r.nameFirst
            || l.nameFirst == r.nameFirst && l.nameLast < r.nameLast }

Jeśli nauczyłem się czegokolwiek podczas pracy w Swift, jest to praca przyrostowa, aby uniknąć konieczności cofania się zbytnio w celu znalezienia niewłaściwego kodu.

Chris Conover
źródło
0
  1. Czy stan indeksowania to „kółko wskaźnika” lub „pasek postępu”?
  2. Jeśli jest to „koło wskaźnikowe”, oznacza to, że utknęło już na początku.
  3. Otwórz i sprawdź w innych projektach, jeśli wszystkie są takie same, oznacza to, że jest to problem z systemem.
  4. Po prostu uruchom ponownie komputer i wszystko będzie dobrze.
Weidian Huang
źródło
0

Używam Xcode 8.2 i również skończyłem na tym problemie. Zaczęło się po zdefiniowaniu złożonej zmiennej krotki - tablicy krotek z podtablicą krotki. Sprawy stają się naprawdę powolne, gdy podtablica krotki ma właściwość obliczaną programowo.

Jak zauważono w innych odpowiedziach, indeksowanie trwa wiecznie i wydaje mi się, że próbuje wywnioskować, jakie typy są zmienne.

Najpierw rozwiązałem problem, jasno definiując zmienną z zawartymi typami. Podczas aktualizacji właściwości najpierw ją obliczam, a następnie przypisuję do krotki, zamiast obliczać przy definiowaniu zmiennej.

Oto przykładowy kod.

var sectionTuples: [(section: String, rows: [(name: String, subtitle: String)])] = []
let subtitle1: String = "" // something calculated dynamically
let subtitle2: String = "" // something calculated dynamically
sectionTuples = [(
section: "Section 1", rows: [
(name: "name1", subtitle: subtitle1),
(name: "name2", subtitle: subtitle2)
])]

Najważniejsze jest to, że nie pozwala Xcode na wnioskowanie o złożonych strukturach.

Q Liu
źródło
0

Miałem ten sam problem. Mój Xcode to 8.2.1. Ale w moim przypadku chciałem stworzyć tablicę słownika z 33 parami klucz-wartość. Robiłem w następujący sposób, który utknął w indeksowaniu:

var parameter = [String : AnyObject]()
var finalArray = [parameter]

for item in listArray
{
    parameter = ["A": item.a as AnyObject, "B": item.b as AnyObject, "C": item.c as AnyObject, ... , "Z": item.z as AnyObject]

    finalArray.append(parameter)
}

Pracowały dla mnie następujące:

var parameter = [String: AnyObject]()
var finalArray = [parameter]

for item in listArray
{
    parameter["A"] = listArray.a as AnyObject
    parameter["B"] = listArray.b as AnyObject
    parameter["C"] = listArray.c as AnyObject
    parameter["D"] = listArray.d as AnyObject 
    .
    .
    .
    parameter["Z"] = listArray.z as AnyObject 
    finalArray.append(parameter)
}
Trup
źródło
0

Miałem również ten problem i rozwiązałem go, usuwając / zmieniając wyrażenia za pomocą operatora „+”.

Zmieniłem to:

var mainArray = arrayOne + arrayTwo + arrayThree + arrayFour + arrayFive

Do tego:

var mainArray = arrayOne
mainArray += arrayTwo
mainArray += arrayThree
mainArray += arrayFour
mainArray += arrayFive

To rozwiązało problem.

Moja maszyna ma maksymalny MBP pod koniec 2013 roku

Casey Laris
źródło
Dokładnie moje doświadczenie. Wisi z doskonale dobrym kodem Swift, a jedynym sposobem na naprawienie tego jest zmiana kodu.
gnasher729
0

Możesz chcieć zaktualizować do Xcode 6.1.1

Został oficjalnie wydany i rozwiązany dla nas problem indeksowania. W opisie aktualizacji jest napisane, że zastosowali poprawki stabilności, więc jest bardzo prawdopodobne, że będzie zachowywać się w bardziej stabilny sposób.

Angel Naydenov
źródło
7
Ciekawy. Dla mnie 6.1.1 wprowadził problem z niekończącym się indeksowaniem, z projektem, który otwierał się dobrze w 6.1. znak
Pascal Bourque
Widzę. W naszym przypadku uprościliśmy również wyrażenia i zmniejszyliśmy rozmiary klas za pomocą klas rozszerzających. Co jest dość śmieszne, że musieliśmy to zrobić, ale to właśnie musieliśmy zrobić. I wydaje się, że na razie działa. Również przez wykomentowanie wierszy zawęziliśmy, który fragment kodu jest w rzeczywistości „zbyt złożony” zgodnie z tym, co myśli kompilator Swift i zredukowaliśmy złożoność tak bardzo, jak to możliwe. Mam nadzieję, że wkrótce to naprawią, ponieważ jest to dość denerwujące.
Angel Naydenov
0

Wersja beta Xcode 6.2 rozwiązała problem za mnie. Nie błyskawicznie, ale przynajmniej indeksowanie nie trwa wiecznie. Wersja beta nie instaluje się ponad zwykłą instalacją Xcode, więc jeśli nie podoba ci się beta, możesz ją po prostu usunąć.

Różne pliki do pobrania Xcode, w tym wersja beta>

Warren Whipple
źródło
0

Miałem takie wyrażenia jak:

let x = (value as? Int) ?? someDefault

również

guard let x = (dateFormatter().string(from: Date()) + msg + "\n").addingPercentEncoding(...) else { ... }

Chodzi o to, aby przepisać plik tak, aby zawierał tylko wyrażenia z poziomu przedszkola, a problem z indeksowaniem zniknie.

soger
źródło