Die Eigenschaft kann nicht als öffentlich deklariert werden, da ihr Typ einen internen Typ verwendet


100

Ich habe zwei Klassen erstellt Contentund Bucket. Bucketenthält ein Array von ContentObjekten und macht dies über eine öffentliche Eigenschaft verfügbar. Wenn ich dies tue, erhalte ich jedoch die folgende Fehlermeldung:

Die Eigenschaft kann nicht als öffentlich deklariert werden, da ihr Typ einen internen Typ verwendet

Geben Sie hier die Bildbeschreibung ein

Irgendwelche Gedanken darüber, warum dies einen Fehler auslöst?


Es wäre schön zu sehen, wie man nur eine Grundklasse der Öffentlichkeit zugänglich machen kann, wiepublic(Array<NSObject>) let contents: Array<Content>
Ben Leggiero

Antworten:


173

Sie müssen auch die Zugriffsebene der ContentKlasse public deklarieren .

public class Content {
   // some code
}

Wie in der Dokumentation angegeben :

Eine öffentliche Variable kann nicht als interner oder privater Typ definiert werden, da der Typ möglicherweise nicht überall dort verfügbar ist, wo die öffentliche Variable verwendet wird.

Klassen sind internalstandardmäßig deklariert , daher müssen Sie das publicSchlüsselwort hinzufügen , um sie öffentlich zu machen.

Eine ähnliche Regel gibt es auch für Funktionen.

Eine Funktion kann keine höhere Zugriffsebene als ihre Parametertypen und Rückgabetypen haben, da die Funktion in Situationen verwendet werden kann, in denen ihre Bestandteilstypen für den umgebenden Code nicht verfügbar sind.


3
Gute Antwort. Ich fand auch, dass der Fehler nicht verschwinden würde, bis Xcode (9.2) neu gestartet wurde.
Jasongiss

9

Content muss auch als öffentlich deklariert werden:

public class Content {}

Abhängig von Ihrem Anwendungsfall können Sie dies auch Bucketals intern deklarieren . Lassen Sie publicin diesem Fall einfach das Schlüsselwort weg.


1

Mein Problem war ein Namespace-Problem.

Ich hatte eine Aufzählung mit dem Namen deklariert Data, die mit der Swift- DataKlasse zu tun hatte , insbesondere mit einer imageData: DataEigenschaft innerhalb eines Core-Data-Modells.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.