2016-02-14 3 views
2

В grammar section из Swift книги есть две грамматические декларации:Свифта грамматика Выражение явного члена

explicit-member-expression -> postfix-expression . decimal-digits 
explicit-member-expression -> postfix-expression . identifier generic-argument-clause[opt] 

Первые из них используются для доступа к кортежам:

var tuple = (1, 2, 3) 
tuple.1 = tuple.2 

Второй используются для доступ к другим членам, таким как свойства и функции:

struct S { 
    var property = 0 
    func function<T>(parameter: T) {} 
} 

S().property 
S().function(3) 

Однако я сотрудничаю uldn't найти использование для необязательного generic-argument-clause. Запрещается после этих членов:

S().property<Int> // error: '>' is not a postfix unary operator 
S().function<Int>(3) // error: cannot explicitly specialize a generic function 

Таким образом, в этом случае мы можем использовать в generic-argument-clause s?

ответ

2

Общие положения аргументов для выражения членов модулей

Вполне возможно, что 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 в контексте выражения членов.

+0

К сожалению, доступ к общим типам модулей является «идентификатором типа»: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html – Qbyte

+0

Это правда, но в моем примере я обращаюсь к инициализатору, а не к самому типу (немного нечеткое, 'MyLib.MyClass ()'); будет ли он по-прежнему рассматриваться как идентификатор типа? Например, 'MyLib.MyClass () .foo' <- выражение члена" middle ", по-видимому, содержит предложение общего аргумента (и это экземпляр, а не тип здесь). – dfri

+0

(В качестве примера сравните 'let typeIdentifier = UIKit.UIView // UIView.Type' с' let memberExpression = UIKit.UIView() // UIView instance' или 'anotherMemberExpression = UIKit.UIView(). Alpha // 1 (CGFloat) ') – dfri

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