Swift'teki 'açık' anahtar kelime nedir?


334

ObjectiveC.swiftStandart kütüphaneden dosyası satır 228 civarında aşağıdaki kod birkaç satır içerir:

extension NSObject : Equatable, Hashable {
  /// ...
  open var hashValue: Int {
    return hash
  }
}

open varBu bağlamda ne anlama geliyor veya opengenel olarak anahtar kelime nedir?


2
Olası ilgili: stackoverflow.com/questions/24003918/… (" openve arasındaki fark nedir public?")
Ahmad F

Yan not: “açık” anahtar kelimesi “uzatma için açık, modifikasyon için kapalı” konseptinden geldi
Sazzad Hissain Khan

Yanıtlar:


572

open Swift 3'te yeni bir erişim seviyesidir.

7 Ağustos 2016'daki Swift 3 anlık görüntüsü ve Xcode 8 beta 6 ile kullanılabilir.

Kısacası:

  • Bir opensınıfa tanımlayıcı modülün dışında erişilebilir ve alt sınıfa ayrılabilir . Bir opensınıf üyesine tanımlayıcı modülün dışında erişilebilir ve geçersiz kılınabilir .
  • Bir publicsınıfa tanımlanabilir modülün dışında erişilebilir ancak alt sınıflara ayrılamaz . Bir publicsınıf üyesine erişilebilir ancak tanımlayıcı modülün dışında geçersiz kılınamaz .

Yani openne publicönceki Swift çıkan veya erişimde eskiden publickısıtlanmıştır. Veya Chris Lattner'ın SE- 0177'ye koyduğu gibi : Genel erişim ve genel geçersiz kılma arasında ayrım yapmanıza izin verin :

“Açık” artık çok basit ve temiz bir model sağlayan basitçe “halka açıktır”.

Örneğin, open var hashValueerişilebilir ve NSObjectalt sınıflarda geçersiz kılınabilen bir özelliktir .

Daha fazla örnek ve detay için SE-0117'ye bakınız .


16
Yani publicSwift 3'te public finalSwift 2'deki gibi ve opennasıl public?
Clashsoft

16
@Clashsoft: Swift 3'teki "open", Swift 2'deki "public" gibidir. Swift 3'teki "public" in Swift 2'de karşılığı yoktur. (Bir final sınıfı aynı modülde bile alt sınıflara ayrılamaz.)
Martin R

59
Bu komik bir mantıksız. Özet için teşekkürler.
GoldenJoe

7
@MikeS ile aynı fikirde olun ve geriye dönük uyumluluğun olmaması bunu korkunç bir karışıklık haline getirir.
HughHughTeotl

14
@MikeS apple - gereksiz olsa bile farklı düşünün.
Varun Nath

12

Şu şekilde açık oku

diğer modüllerde kalıtım için açık

Diğer modüllerde kalıtım için açık tekrar ediyorum. Dolayısıyla açık bir sınıf, tanımlayıcı modülü içeren diğer modüllerde alt sınıflamaya açıktır. Açık değişkenler ve işlevler diğer modüllerde geçersiz kılmaya açıktır. En az kısıtlayıcı erişim seviyesidir. Halka açık erişim, halka açık olan bir şeyin diğer modüllerde kalıtım için kapalı olduğunu kabul etmek kadar iyidir.

Gönderen Elma Dokümanlar :

Açık erişim yalnızca sınıflar ve sınıf üyeleri için geçerlidir ve genel erişimden şu şekilde farklıdır:

  1. Herkese açık erişime veya daha kısıtlayıcı erişim düzeyine sahip sınıflar, yalnızca tanımlandıkları modülde alt sınıflara ayrılabilir.

  2. Herkese açık erişimi olan veya daha kısıtlayıcı erişim düzeyine sahip sınıf üyeleri, yalnızca tanımlandıkları modül içindeki alt sınıflar tarafından geçersiz kılınabilir.

  3. Açık sınıflar, tanımlandıkları modül içinde ve tanımlandıkları modülü içe aktaran herhangi bir modül içinde alt sınıflara ayrılabilir.

  4. Açık sınıf üyeleri, tanımlandıkları modül içindeki ve tanımlandıkları modülü içe aktaran herhangi bir modül içindeki alt sınıflar tarafından geçersiz kılınabilir.

5

Açık bir erişim seviyesidir, Swift'e sınıf mirasına sınırlamalar getirmek için getirilmiştir.

Bu, açık erişim düzeyinin yalnızca sınıflara ve sınıf üyelerine uygulanabileceği anlamına gelir .

Sınıflarda

Açık bir sınıf, içinde tanımlandığı modülde ve sınıfın tanımlandığı modülü içe aktaran modüllerde alt sınıflara ayrılabilir.

Sınıf üyelerinde

Aynı şey sınıf üyeleri için de geçerlidir. Açık bir yöntem, içinde tanımlandığı modülde ve yöntemin tanımlandığı modülü içe aktaran modüllerde alt sınıflar tarafından geçersiz kılınabilir.

BU GÜNCELLEME İHTİYACI

Bazı kitaplık ve çerçeve sınıfları alt sınıflara göre tasarlanmamıştır ve bunu yapmak beklenmedik davranışlara neden olabilir. Yerel Apple kitaplığı da aynı yöntemlerin ve sınıfların geçersiz kılınmasına izin vermez,

Dolayısıyla, bu eklemeden sonra kamu ve özel erişim seviyelerini buna göre uygulayacaklardır.

Daha fazla ayrıntı için Erişim Kontrolü ile ilgili Apple Belgelerine bakın


1

Alt sınıf dışında, a open class funcprojenizin herhangi bir yerinden erişilebilir. Diyelim ki Util sınıfınızda böyle bir açık sınıf fonksiyonu tanımlıyorsunuz

open class Utils: NSObject {
    open class func printHello() {
        print("Hello from utils")
    }
}

Daha sonra görünüm denetleyicilerinizin herhangi bir yerinde bu yöntemi arayarak

Utils.printHello()

3
Bu cevap, herkese açık olarak yapabileceğinizden, herkesten nasıl farklı olduğunu açıklamaz.
Jose Ramirez

Bu konuda biraz daha açıklamaya ihtiyacım var
MD Aslam Ansari

1

açık çoklu modüller ile uğraşırken oynamaya geliyor.

açık sınıfa tanımlayıcı modülün dışında erişilebilir ve alt sınıfa ayrılabilir. Bir açık sınıf üyesine tanımlayıcı modülün dışında erişilebilir ve geçersiz kılınabilir.


0

open sadece başka bir modül içindir: kakao kapsülleri veya birim testi, devralınabilir veya geçersiz kılabiliriz

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.