2015-12-12 9 views
0

У меня есть рабочее пространство в Xcode с моей каркасом и с тестовым приложением, поэтому два проекта xcode в одном рабочем пространстве. В рамках Я строй singleton класса, например, так:Swift singleton pattern в каркасе

public let sharedInstance = MKUserPreferences() 

class func A() {} 
class func B() {} 

Но когда я в проекте приложения и пытаюсь вызвать MKUserPreferences.sharedInstance.A(), он не будет автозаполнение и этот метод не доступен. Как я могу это решить?

EDIT: имейте в виду, что MKUserPreferences находится в динамически связанной структуре, и я хочу использовать его в своем приложении (в другом проекте).

+0

Downvoter: помочь объяснить сами? – jbehrens94

ответ

2

A и B определены как class методов. Поэтому к ним можно получить доступ из класса MKUserPreferences.A(), но не из экземпляра.

Если вы хотите, чтобы они были методы экземпляра, просто удалите class из их определения:

public class MKUserPreferences { 
    public static let sharedInstance = MKUserPreferences() 
    private init() {} // Prevents using the default '()' initializer 
    public func A() {} 
    public func B() {} 
} 

Кроме того, вы должны явно определить методы, которые должны быть открытыми. В Apple's words:

Публичный тип по умолчанию имеет внутренние элементы, а не публичные элементы. Если вы хотите, чтобы член типа был общедоступным, вы должны явно указать его как таковой. Это требование гарантирует, что API открытого типа для типа - это то, что вы выбираете для публикации, и избегаете ошибки во внутреннем выражении типа public API.

+0

Они не могут быть доступны, как 'MKUserPreferences.A()', потому что они находятся в рамках проекта (они должны быть общедоступными). Итак, в рамках проекта у меня есть это 'MKUserPreferences', который должен быть общедоступным (динамически связанная структура), но я хочу, чтобы sharedInstance получал доступ к внутренним методам. – jbehrens94

+0

Возможно, было бы полезно, если вы загрузите образец проекта, который предоставляет проблему где-нибудь, мы могли бы скачать его и проверить. – veducm

+0

Я разместил фреймворк [здесь] (http://github.com/jbehrens94/MagisterKit) и приложение [здесь] (http://github.com/jbehrens94/Voldoende). – jbehrens94

0

В стрижа, вы можете создать класс OneLine одноплодной так:

static let sharedInstance = MKUserPreferences() 
private override init() { 
     super.init() 
} 
func otherFunc(){} 

и вы можете использовать, как это:

MKUserPreferences.sharedInstance.otherFunc() 

надеюсь, что это помогло вам.

+0

Извините, но это мне не помогло. Ошибка при ошибке 'значение типа MKUserPreferences не имеет члена otherFunc'. – jbehrens94

+0

Для ваших знаний: в рамках проекта у меня есть MKUserPreferences, и в проекте приложения я хочу это использовать. Поэтому я сделал sharedInstance общедоступным. – jbehrens94