2016-09-17 2 views
5

Итак, как вы определяете общие константы класса в Swift?Как определить статическую константу в родовом классе в swift?

Проблема

Для "нормального" класса вы можете определить их как это:

class C { 
    static let k = 1 
} 

let a = C.k // 1 

Но если вы делаете то же самое на общий класс:

class C<T> { 
    static let k = 1 
} 

Вы получить следующую ошибку при составлении:

Статические сохраненные свойства пока не поддерживаются в универсальных типах

Так как решить эту проблему?

Мое текущее решение

Прямо сейчас, я использую struct решить эту проблему:

struct CConstant { 
    static let K = 1 
} 

Это не определен в рамках общего класса, но это работает для меня. У вас есть лучшее решение?

-

пс: это мой первый вопрос здесь, так что, пожалуйста, помогите мне улучшить этот вопрос, если вы думаете, что нужно =)

ответ

2

Вы можете определить глобальную константу с fileprivateprivate или уровня доступа в том же файле .swift, где определен ваш общий класс. Поэтому он не будет виден вне этого файла и не будет загрязнять глобальное (модульное) пространство имен.

Если вам необходимо получить доступ к этой константе из-за пределы текущего файла затем объявить его как internal (по умолчанию уровня доступа) или public и назовите его как ClassConstant так будет очевидно, что это относится к Class.

Подробнее о access levels in Swift 3.

+0

Спасибо, что ответили! Ваше предложение, похоже, находится в одном направлении с моим текущим решением. Я просто должен указать аксессоров в зависимости от контекста. Знаете ли вы, почему «Статические сохраненные свойства еще не поддерживаются в общих типах»? – ghashi

+0

Я думаю, что они еще не поддерживаются, потому что вы не можете использовать общий тип без указания его параметров типа. И что 'SomeClass .someConstant' будет выглядеть уродливым, если вы просто хотите получить доступ к статическому свойству. Чтобы заставить его работать без указания параметров типа, необходимо реализовать это в компиляторе, и я думаю, что это не приоритетная задача для команды Swift. – mixel

1

Для тривиальных констант значения типизации, вы могли бы просто реализовать только для чтения статического вычисленного свойства:

class C<T> { 
    // will be evaluated every time the static property is accessed, 
    // therefore not suited for non-trivial constants. 
    static var k : Int { return 1 } 
} 

let a = C<()>.k // Access k on C<Void> 

Это имеет преимущество не загрязнять «глобальное пространство имен», поскольку это статический член на C<T> , Хотя, к сожалению, вы должны указать общий параметр, чтобы использовать константу - поскольку вы не можете ссылаться на тип общего класса без общего параметра (поскольку что-либо в статической области может потребовать его определения).

Для нетривиальных констант, можно определить частную глобальную константу, и использовать только для чтения статического вычисленного свойства в вашем родовом классе для того, чтобы выставить его с внешним миром:

private let _k = SomeClass() 

class C<T> { 
    static var k : SomeClass { return _k } 
} 

Опять же, это позволяет вам получить к нему доступ как статический член на C<T>, не загрязняя «глобальное пространство имен» (хотя и не за пределами файла Swift, который вы его определяете).

Смежные вопросы