Swift Protokolü ile Java Arayüzü Karşılaştırması


149

Apple geliştirici sayfasından iOS eğiticisinden geçiyorum .

Bana öyle geliyor protocolve interfaceneredeyse aynı işlevselliğe sahip.

  • İkisi arasında herhangi bir fark var mı?

  • projedeki farklı kullanım?

Güncellenmiş

Evet , ben yukarıdaki bağlantıyı okumak yaptı ve emin hala neyi farklılıkları arasındaki kullanımını değilim protocolve interface. Böyle bir soru sorduğumda konuyla ilgili basit bir açıklama görmek istiyorum. Bazen dokümantasyondan her şeyi almak zor olabilir.


1
Swift'teki protokoller ve Java'daki arayüzler aynı kavramlardır. Buraya
Vivek Molkar

69
Bence bu tür diller arasındaki farklılıklar hakkındaki sorular, dil özelliklerini anlamak için gerçekten yararlıdır. Ve gereksiz görüşlü cevaplara yol açtıklarını sanmıyorum ve cevapları dokümantasyonda bulmak çok kolay değil. Bu yüzden bu sorudaki aşağı oyların haklı olduğunu sanmıyorum.
Lii

1
İşte Java arayüzleri hakkında birkaç kritik gerçek nokta - stackoverflow.com/a/41143492/294884 - Swift ile yeni başlayan
Fattie

Diğer yönde, Swift'in tüm nedeninin "protokol odaklı programlama" olduğunu hatırlamak woprth . Swift'te her yerde "protokol uzantıları" ile her şeyi yaparsınız. Örneğin burada bazı sorunları göstermektedir: ( "protokol uzantıları hakkında" ie) Swift hakkında ince bir konudur.
17'de Fattie

2
Swift'te, arayüzler yerine protokol adı kullanılır, çünkü C'den Objective C başlık dosyalarına (işe yaramaz kopyalar) arayüzler denir
Alex78191 29:18

Yanıtlar:


117

Protokoller aşağıdakiler haricinde Java arayüzlerine çok benzer:

  • Swift protokolleri de uygulanması gereken özellikleri belirtebilir (ör. Alanlar)
  • Hızlı protokollerin, mutasyona uğrayan anahtar kelimenin kullanılmasıyla değer / referansla uğraşması gerekir (çünkü protokoller yapılar ve sınıflar tarafından uygulanabilir)
  • protokolleri protokol <> anahtar sözcüğü ile istediğiniz zaman birleştirebilirsiniz. Örneğin, protokol A ve B'ye uyması gereken bir fonksiyon parametresini şu şekilde bildirmek:

.

func foo ( var1 : protocol<A, B> ){}

Bunlar, bir Java geliştiricisi (veya en azından şimdiye kadar tespit ettiğim) için hemen görünen farklardır.


13
" protokol <> anahtar kelime ": Bu gerçekten harika! Bence bu tür sistem teorisi topluluğunda bir kavşak türü denir . I Java, yalnızca birden çok sınırı olan tür parametreleri için bu tür türlere sahip olabilirsiniz. Bu makale , bunları birinci sınıf tür olarak Java ile tanıtmayı ve bunları belirtmek için sözdizimini önermektedir.
Lii

7
Güzel özet. Birkaç önemli özellik daha: Swift protokolleri ilişkili tür gereksinimlerini de belirtebilir; örneğin, bir koleksiyon türünün ilişkili bir dizin türü vardır veya karşılaştırılabilir bir türün karşılaştırma yöntemleri aynı türden bir parametre gerektirir. Swift 2.0'da protokol uzantıları, protokol gereksinimlerini karşılayan türlere gerçek işlevsellik ekleyebilir.
rickster

2
@rickster Java 8 de bir yöntemi default anahtar kelimeyle etiketleyerek bir arayüze uygulama ekleyebilir . Oracle Eğiticisine bakın .
Basil Bourque

5
<> Protokol anahtar sözcüğü şimdi ve işareti lehine kaldırılmıştır. Yani şunu yazabilirsiniz: Let c: A & B
Paul Robinson

2
Swift'te, arayüzler yerine protokol adı kullanılır, çünkü C'den Objective C başlık dosyalarına (işe yaramaz kopyalar) arayüzler denir
Alex78191 29:18

33

Thomas Schar'ın cevabını tamamlıyor. Swift protokol sihri uzantıdan geliyor.

  • Swift protokolleri, uzantı aracılığıyla uygulamalar alabilir (Swift
    2). Java 8 arabiriminin varsayılan uygulamaları olabilir, ancak "geriye dönük olarak" yapılamaz.
  • Swift'te,
    herhangi bir sınıfa veya yapıya protokol gereksinimlerini (ve gerekirse uygulamalarını) "geriye dönük olarak" ekleyebilirsiniz .
  • Swift protokolleri genel (yani <..>) özelleştirme desenini değil, bir typealias şemasını (yani İlişkili Türler) izler. Başlangıçta kafa karıştırıcı olabilir, ancak
    bazı durumlarda "açılı ayraç körlüğü" nü önleyebilir .
  • Swift, protokol gereksinimlerinin ve uzantılarının nereye ve nasıl uygulandığı konusunda çok spesifik olmasına izin veren gelişmiş bir tür desen eşleşmesine sahiptir. Java'dan geldiğinde kafa karıştırıcı olabilir, ancak çok fazla gücü vardır.
  • Bir özellik / param için hızlı bir protokol oluşturulabilir (örn. Kutlama: protokol)

Beni birkaç saat başıma kaşıran şeylerden biri, tüm protokollerin özellik türü olarak kullanılamaması. Örneğin, typealias içeren bir protokolünüz varsa, bunu doğrudan bir özellik türü olarak kullanamazsınız (bunu düşündüğünüzde mantıklıdır, ancak Java'dan gelmek gerçekten userdao: IDao gibi bir özelliğe sahip olmak isteriz).


7
Ayrıca Swift protokolleri, Java arayüzlerinden farklı olarak isteğe bağlı üyelere sahip olabilir.
eyeApps LLC

4
Swift'te her zaman ortaya çıkan küçük bir nokta, (gülünç bir şekilde) soyut işlevler yoktur, bu yüzden sadece "bunu unuttun yazdır!" ... stackoverflow.com/a/24111430/294884
Fattie

@Fattie. Bir alt sınıf uygulaması gerektirdiğini belirtmek için bir işlevdeki "zorunlu" anahtar sözcüğünü kullanabilirsiniz. Gerçekten, gerçek bir noktadan ziyade küçük bir cehalet gibi.
Dirk Bester

@DirkBester - Şerefe - Bekle, başlatıcılardan bahsediyorsun ??
Fattie

Yine @DirkBester Biraz karışıklık olabilir ama requiredbir protokolde bir işlev önce kullanamazsınız , sadece 'required' may only be used on 'init' declarations...
Fattie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.