Общие положения аргументов для выражения членов модулей
Вполне возможно, что generic-argument-clause
имеет только случай использования для модулей (SomeModule.SomeGeneric<SomeType>()
). Из Language Reference - Expressions:
Явного выражение члена Выражения Явной член обеспечивает доступ к членам имени типа, кортежа, или модуля. Он состоит из периода (.) Между пунктом и идентификатором его члена.
В качестве примера:
/* Module 'MyLib.a' ... */
class MyClass<T> {
var foo: T?
}
/* ... elsewhere: explicit member expression to module */
MyLib.MyClass<Int>()
достаточно Любопытно, что implicit member expressions не включает в себя грамматику generic-argument-clause[opt]
, который мы можем интерпретировать как неявный курсор, что последний, для явного выражения членов, не относится, на наименее, перечисления; возможно, немного усиливая теорию о том, что это касается модулей.
грамматика неявного выражения члена
implicit-member-expression → .identifier
Другие случаи использования, вне что модули?
Я не могу точно сказать, что вышеприведенное применимо только для модулей, но я не смог найти других применений общих аргументов аргументов в контексте выражений членов.
Ниже следует некоторые релевантные ссылки в несколько обсуждаемом контексте; это может, возможно, иметь некоторое значение для исследования других в этом, помимо того, что модули.
Прежде всего, что такое общий аргумент аргумента?От Language Reference - Generic Parameters and Arguments - Generic Argument Clause
Обобщенное предложение аргумента указывает аргументы типа общего типа.
...
Общий список аргументов, разделенных запятыми список аргументов типа. Аргумент типа - это имя фактического конкретного типа, который заменяет соответствующий тип типа в предложении общих параметров типового типа . Результатом является специализированная версия этого общего типа .
...
специализированная версия универсального Dictionary
типа, Dictionary<String, Int>
формируется путем замены родового Parameters Key: Hashable
и Value
с конкретным типом аргументы String
и Int
.
Теперь же раздел оборачивает со следующим утверждением:
Как уже упоминалось в Generic Параметр п, вы не используете общий пункт аргумент, чтобы указать аргументы типа из общая функция или инициализатор.
Прыгает в Пункте раздела Generic параметров и читать:
... В отличии от общих типов, вы не указали общий пункт аргумента, когда вы используете общей функции или инициализатора. Аргументы типа вместо этого выводятся из типа аргументов , переданных функции или инициализатору.
Так что для субъекта этого вопроса, мы должны сосредоточиться на сочетании выражений членов и (для правой части из .
) родовых типов; а не общие функции. Но в каком контексте - в дополнение к модулям - можем ли мы объединить эти два и общие аргументы? Первое, что может прийти на ум, является enum
с ассоциированным родового типа:
enum Bar<T> {
case One(T)
case Two
}
var foo = Bar.One(1)
print(foo.dynamicType) // Bar<Int>
Но это тип логического вывода, а не общие положения аргументов.
Из вышесказаннога я могу думать только модули, как прецедент для грамматики generic-argument-clause
в контексте выражения членов.
К сожалению, доступ к общим типам модулей является «идентификатором типа»: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html – Qbyte
Это правда, но в моем примере я обращаюсь к инициализатору, а не к самому типу (немного нечеткое, 'MyLib.MyClass()'); будет ли он по-прежнему рассматриваться как идентификатор типа? Например, 'MyLib.MyClass () .foo' <- выражение члена" middle ", по-видимому, содержит предложение общего аргумента (и это экземпляр, а не тип здесь). –
dfri
(В качестве примера сравните 'let typeIdentifier = UIKit.UIView // UIView.Type' с' let memberExpression = UIKit.UIView() // UIView instance' или 'anotherMemberExpression = UIKit.UIView(). Alpha // 1 (CGFloat) ') – dfri