swift java_Swift for Java Guy:第2部分–基础

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()

此示例还显示了使用getset关键字的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值