2015-12-19 14 views
7

Kodlarım, olabildiğince kısa yöntem ve dosyaları saklayarak ve ad alanı için iç içe geçmiş sınıfları kullanarak mümkün olduğunca okunabilir durumda tutmaya çalışıyorum. Gerçekten garip bir an dışında iyi çalışıyor.Xcode, iç içe geçmiş bir sınıfın benzer uzantılarının yalnızca bazılarını ayrı dosyalarda yazdığını görür

Ad aralığı için bazı sınıfları kullanıyorum.

class Space { } 

İçinde kullanılan tüm sınıflar kendi dosyalarında uzantı olarak uygulanır. Bu SomeClasses ait

extension Space { 
    class SomeClass { 
     // implementation 
    } 
} 

biri oldukça sofistike olan başlatıcı bir dizi var, bu yüzden aşağıdaki gibi ben de kendi dosyalarına bunları bölmek ve bunu uygulayan: Sorun bazı olmasıdır

extension Space.SomeClass { 
    convenience init(fromSomeSource source: SourceClass) { 
     self.init() 
     // other implementation 
    } 
} 

Bu dosyalar sadece iyi çalışıyor, ama bazıları 'SomeClass' is not a member type of 'Space' atıyor ve nedenini bilmiyorum.

Hepsi de oldukça benzer. Tek fark, bir başlatıcının kendisinin uygulanmasıdır. Tüm dosyalar aynı yerde tutuluyor ve bazılarının neden iyi çalıştığını bilmiyoruz.

Kodları çalışmayan dosyalardan düzgün çalışan ve çalışan dosyalara taşımaya çalıştım. Xcode, kodu görmeyi kabul eder ve ona karşı hiçbir şey söylemez. Ama aynı kod kendi dosyasında yandığında Xcode veya derleyici, SomeClass'un gerçekten Space'un bir üyesi olduğunu anlamak istemez.

~/Library/Developer/Xcode/DerivedData klasörünün manuel dökümü dahil olmak üzere yapıyı temizlemeye çalıştım. Hiç bir şey yardımcı olmaz.

Şüphesiz hepsini tek bir dosyaya koyabiliyorum ve iyi çalışacak, ama neden bu kadar seçici davrandım?


Yeni bir dosya oluşturmaya çalıştım ve tüm içeriği kötü olanlardan birine taşımaya çalıştım. Bu çalışır, ancak sadece belirli dosya isimleri ile. Bazı isimler aynı hatayı tekrar verir, ancak ismin tamamen yeni ve mevcut olanlardan herhangi birine benzememesi gibi görünüyor - işe yarıyor. Sihirli?

+0

Siz yazıyorsunuz: "Tek fark, başlatıcının kendisinin uygulanmasıdır." Fark ne?Farkı ayırmaya çalışın ve derleyicinin mesajları da dahil olmak üzere kodunuzda neler olduğunu bize göstermeye çalışın. – user3441734

+0

@ user3441734 Fark, başlatıcı için argüman olarak farklı türde nesnelere sahip olmalarıdır, bu yüzden her bir tür kendi yoluna göre tedavi edilebilir. Bir vakada olduğu gibi, karşılık gelen özelliği tedavi olmaksızın sınıfa koyarım, diğer bir durumda da bir şekilde bir ipi değiştiririm. Ancak sorun şu ki, kodun kendisi iyi çalışıyor. Başka bir dosyaya koyabilirim ve işe yarayacak. Yani sorun, bir dosyada nerede saklayacağım bir yerdedir. Bu şey önemli. Xcode'dan aldığım tek mesaj şudur: '' SomeClass '' Space'' üye numarası değil –

cevap

3

Benzer bir sorunla karşılaştım, derleyici, yuvalanmış sınıfı tanımlandığı yerin önüne genişlettiğiniz dosyayı işlemeye çalışıyor gibi görünüyor. Bu nedenle, Space'un SomeClass numaralı üyeye sahip olmadığını söyleyen bu hata var.

Bulduğum çözüm, hedef ayarlarınıza gitmek için Build Phases'u açın. Bunu uzatmak nereye iç içe geçmiş sınıf yukarıdaki dosyaları tanımlamak dosyayı koymalıyız Compile Sources bölümünde bulunmaktadır

enter image description here

.


Bu çözüm bile gözlem ile iyi oynamak gibi görünüyor size Compile Sources değişiklikler dosyasını konumunu yeniden oluştururken, çünkü bazen, derler dosyayı yeniden zaman.

+0

Teşekkür ederiz, Nikita! –

İlgili konular