swift java
在本系列的第1部分中,我们研究了如何启动和运行Swift。 在这一部分中,我们将通过创建Swift类并将它们与Java进行比较,从而在语言级别上了解Java与Swift之间的差异。 对于本文,我们将介绍类构建的基本知识。
什么都一样
两种语言基本上都是具有单个继承和接口的基于静态类型的基于OO的类。 此外,Swift还包含Java具有的常规功能集,包括:
- 尝试捕获样式异常处理
- C样式语法
- 泛型
- 一流和高阶功能
有什么不同
Swift在以下关键领域有很大不同:
- 使用自动引用计数而不是垃圾收集器的基于引用的内存管理。
- Swift类不从基础对象类继承。
- 无需在遵循“命名空间”和“类”名称模式的文件中声明Swift类。
- Swift中的所有方法都是函数,Swift中的Void对于空的Tuple是必不可少的类型别名。
- Swift只有三个访问修饰符,私有和公共,其行为与Java等效。 它也有
internal
,它相当于Swifts的默认访问权限,但是Swift没有受保护的修饰符。 - Swift接口(或在Swift术语中称为协议)不能具有默认实现(尽管您可以通过扩展实现相同的效果)。
- Swift中的枚举是“不同的”。 我能描述的最好方法是,Swift Enums基本上是一个名为Tuples的集合,这些集合在Enum声明中分组在一起,每个人都可以声明自己的结构。
Swift没有Java的东西。
Swift具有Java所没有的一系列功能
- 值类型(结构)
- 元组
- 扩展类型
- 运算符重载
- 类型推断
- 语言级别可选的monad和严格的null检查
- 物产
- 破坏者
- 值和变量,而不只是变量ala Scala
- 嵌套函数(函数内部的AKA函数)
- 模式匹配
在Swift中宣布您的第一堂课
在此示例中,我使用单个void方法makeSound创建了一个称为“动物”的简单类。
class Animal {
func makeSound() -> Void {
print("Roar!!")
}
}
Animal().makeSound()
一些观察:
- Swift方法是使用
func
关键字显式声明的,并且在“->”运算符之后具有返回类型,这与Java方法的声明顺序相反。 - 最后一行创建
Animal
的新实例,并调用makeSound
方法。 注意Animal也有一个隐式的no-args constructor
,也没有new
关键字。
添加属性
所以显然不是所有的动物都吼叫,为解决这个问题,我们通过添加以下内容为类添加了属性sound
class Animal {
var sound:String = "Croak"
func makeSound() -> Void {
print(sound)
}
}
let animal = Animal()
animal.sound = "Roar"
animal.makeSound()
默认情况下,声明为成员的所有变量(由var
关键字表示)均为属性。 这里看不到的是,当您设置sound属性时,实际上是通过隐式创建的访问器方法进行访问的。 值得一提的另一点是, animal
变量根本不是变量,而是由let
关键字指示的常量, let
关键字与Swift等同于Scala的val
关键字。
建设者
在前面的示例中,我将roar设置为默认值“ Croak”,如果可以通过构造函数传递此信息并使sound属性不可变,则更好,为此,我们如下更改类:
class Animal {
let sound:String
init(sound:String) {
self.sound = sound
}
func makeSound() -> Void {
print(sound)
}
}
let animal = Animal(sound:"Roar")
animal.makeSound()
Swift的构造函数在语法方面与Java稍有不同,因为它们是在用关键字init
定义的块内部定义的。 这些块可以像在Java构造函数中那样采用参数。 我还将声音属性从var
更改为let
,这意味着一旦分配了声音属性就无法将其重新分配。 在这里还值得展示的是,Swift要求您在调用构造函数时使用命名参数,这对于曾经使用过Objective-C的任何人都是熟悉的。
添加接口(或协议)
由于动物不是唯一发出声音的东西,因此我们可以将此功能引入名为Audible
的协议中,该协议可以由Animal
类实现。
protocol Audible {
func makeSound() -> Void
}
class Animal:Audible {
let sound:String
init(sound:String) {
self.sound = sound
}
func makeSound() -> Void {
print(sound)
}
}
let audible:Audible = Animal(sound:"Roar")
audible.makeSound()
在这里,除了protocol
关键字之外,我还添加了带有makeSound方法的protocol
,这对于大多数Java开发人员来说应该很熟悉。 对Animal
类的唯一更改是它实现了Audible
。 扩展和实现的语法是冒号语法,与C#的工作方式相同。 我也明确地输入我可听值是类型的Audible
只是为了强制向上转型。
协议属性
用属性将属性放到协议上。 在这个例子中,我创建了另一个名为Named
协议,它只有一个String属性。 name
protocol Named {
var name:String {get set}
}
protocol Audible {
func makeSound() -> Void
}
class Animal: Audible, Named {
let sound:String
var name:String
init(sound:String, name:String) {
self.sound = sound
self.name = name
}
func makeSound() -> Void {
print(sound)
}
}
let animal = Animal(sound:"Roar", name:"Lion")
print(animal.name)
animal.makeSound()
此示例还显示了使用get
和set
关键字的name属性的可变性。 有趣的是,我仍然必须在Animal
类上定义实际的名称变量。 请记住,协议定义了行为,协议上的属性仅指示该属性的结构方式,而不是其存储方式,这是实现类的责任。
遗产
对于最后的添加,让我们创建一个名为LivingOrganism
的类,该类实现Named
并使Animal
对此进行扩展。 我还添加了一个默认的构造函数,该构造函数将name
属性作为参数
class LivingOrganism:Named {
var name:String
init(name:String) {
self.name = name
}
}
class Animal: LivingOrganism, Audible {
let sound:String
init(sound:String, name:String) {
self.sound = sound
super.init(name:name)
}
func makeSound() -> Void {
print(sound)
}
}
再次注意C#样式继承语法。 要注意的另一件有趣的事情是使用super关键字,其行为与Java中的super非常相似。 在这种情况下,我在Animal内部调用了超类init方法。 与Java的不同之处在于,Swift要求在调用超级构造函数之前先初始化局部变量,因此该调用是Animal构造函数的最后一行。 这与Java相反。
因此,我们有了它,它是Swift中类构造的基本概述。 在下一部分中,我们将探讨Swift的一些其他功能,例如使用可选的monad进行的Tuples和Strict Null检查。
翻译自: https://www.javacodegeeks.com/2016/06/swift-java-guy-part-2-basics.html
swift java