Swift用Swift编写的AST。 ∞的第7部分
在上一部分中,我介绍了struct和class声明。 在这一部分中,我将描述Swift语言的另一个基本支柱:协议。
通常,让我们从语法开始:
好吧,看起来就像是类和结构。 但是,它不允许在协议内部定义任何声明,而只限于几种严格的情况。
让我们为该语法编写代码。
struct ProtocolDeclaration {
let属性:[Attribute]
让accessLevel:AccessLevelModifier?
命名:标识符
让typeInheritance:TypeInheritanceClause?
让成员:[ProtocolMember]
}
枚举ProtocolMember {
案例var(ProtocolPropertyDeclaration)
案例`func`(ProtocolMethodDeclaration)
案例`init`(ProtocolInitializerDeclaration)
案例`subscript'(ProtocolSubscriptDeclaration)
案例`associatedtype`(ProtocolAssociatedTypeDeclaration)
case`typealias`(TypealiasDeclaration)
案例editorStatement(CompilerControlStatement)
}
属性
这是var
声明的简化版本。 使用struct对其建模应该非常容易:
struct ProtocolPropertyDeclaration {
let属性:[Attribute]
let修饰符:[DeclarationModifier]
命名:标识符
let类型:TypeAnnotation
让getter:GetterKeywordClause
让setter:SetterKeywordClause?
}
有趣的是,此精确声明与常规var
声明的一部分匹配。 这可能是Swift语法中有些技术欠佳的迹象。
方法
struct ProtocolMethodDeclaration {
let属性:[Attribute]
let修饰符:[DeclarationModifier]
命名:标识符
让genericParameters:GenericParameterClause?
让参数:[参数]
让throwBehavior:ThrowsModifier?
让结果:FunctionResult?
let`where`:GenericWhereClause?
}
再一次。 这看起来与常规func
声明完全一样,但是没有主体代码块。 在func
声明中,我们有可选的body块。 语法中技术债务的另一个迹象。 看起来很长一段时间的协议是由常规定义组成的。 后来-引入了特殊的语法版本。
初始化器
struct ProtocolInitializerDeclaration {
let属性:[Attribute]
let修饰符:[DeclarationModifier]
让optionalModifier:InitializerOptionalKind?
让genericParamters:GenericParameterClause?
让参数:[参数]
让throwBehavior:ThrowsModifier?
let`where`:GenericWhereClause?
}
这部分还镜像了没有主体的默认init声明。 我将在下一部分介绍init,但是模式是相同的。
下标
struct ProtocolSubscriptDeclaration {
let属性:[Attribute]
let修饰符:[DeclarationModifier]
让参数:[参数]
让结果:FunctionResult
让getter:GetterKeywordClause
让setter:SetterKeywordClause
}
看起来很像一个函数,但是没有名称(它总是subscript
)
关联类型
struct ProtocolAssociatedTypeDeclaration {
let属性:[Attribute]
让accessModifier:AccessLevelModifier?
命名:标识符
让typeInheritance:TypeInheritanceClause?
让类型:类型?
}
关联类型是类型声明的一种特殊形式,其中类型分配是可选的。 但是他们从原始的typealias声明中使用了很多语法。
- 可以使用iOS企业应用程序开发程序将应用程序分发给其他公司,但不能通过应用程序商店?
- UIScrollView里面的UIScrollView
- 在Xcode的Plist里search数组
- 使用Interface Builder创buildUIScrollView的步骤
- 按下播放后,UIWebView上的QuickTime播放器iOS 9会发出警告
- NSDateFormatter- stringFromDate不返回AM / PM
- 如何解决'NSUnknownKeyException'… setValue:forUndefinedKey:]:…不符合键值编码
- 使用Storyboard的UITableViewCell的“内部”视图和contentview之间剩余的垂直间距是什么原因?
- 没有架构来编译(ARCHS = arm6 arm7,VALID_ARCHS = armv7)