iOS开发-Dart对比Swift

| 作者:Andrea Bizzotto

| 原文链接:medium.com/coding-with…

Dart 和 Swift 是我最喜欢的编程语言。我在商业和开源代码中广泛使用它们。

本文提供了 Dart 和 Swift 之间的比较,旨在:

  • 突出显示两者之间的差异;
  • 作为开发人员从一种语言转移到另一种语言(或使用两者)的参考。

一些背景:

  • Dart 支持 Flutter,这是 Google 用于从单一代码库构建漂亮的本机应用程序的框架。
  • Swift 通过 iOS,macOS,tvOS 和 watchOS 为 Apple 的 SDK 提供支持。

以下是两种语言的主要特征(Dart 2.1Swift 4.2)的比较。由于深入讨论每个功能超出了本文的范围,因此更多的信息可以参考各自的文档。

目录

  • 对照表
  • 变量
  • 类型推断
  • 可变/不可变变量
  • 函数
  • 命名和未命名参数
  • 可选和默认参数
  • 闭包
  • 元组
  • 控制流
  • 集合
  • Nullability & Optionals
  • 继承
  • 属性
  • 协议/抽象类
  • Mixins
  • 扩展
  • 枚举
  • 结构体
  • 错误处理
  • 泛型
  • 访问控制
  • 异步编程:Future
  • 异步编程:Stream
  • 内存管理
  • 编译和执行
  • 其它未涵盖功能

对照表

变量

Dart 中变量声明语法如下:

String name;
int age;
double height;

Swift 中是如下:

var name: String
var age: Int
var height: Double

Dart 中变量初始化语法如下:

var name = 'Andrea';
var age = 34;
var height = 1.84;

Swift 中是如下:

var name = "Andrea"
var age = 34
var height = 1.84

在此示例中,不需要类型注释。这是因为两种语言都可以从赋值右侧的表达式推断出类型。

类型推断

类型推断意味着我们可以在 Dart 中编写以下代码:

var arguments = {'argA': 'hello', 'argB': 42}; // Map<String, Object>

编译器会自动解析 arguments 的类型。

在 Swift 中,同样可以写成:

var arguments = [ "argA": "hello", "argB": 42 ] // [ String : Any ]

更多细节

Dart 文档有如下描述:

分析器可以推断字段、方法、局部变量和大多数泛型类型参数的类型。当分析器没有足够的信息来推断特定类型时,将使用动态类型。

Swift 文档中有如下描述:

Swift 广泛使用类型推断,允许您省略代码中许多变量和表达式的类型或部分类型。例如,不是写 var x:Int = 0,而是可以写 var x = 0,完全省略类型 - 编译器正确地推断出 x 为 Int 类型的值。

动态类型

可以使用 Dart 中的 dynamic 关键字和 Swift 中的 Any 关键字声明可以是任何类型的变量。

在读取 JSON 等数据时,通常会使用动态类型。

可变/不可变变量

变量可以声明为可变不可变

为了声明可变变量,两种语言都使用 var 关键字。

var a = 10; // int (Dart)
a = 20; // ok

var a = 10 // Int (Swift)
a = 20 // ok

为了声明不可变变量,Dart 使用 final,Swift 使用 let

final a = 10;
a = 20; // 'a': a final variable, can only be set once.

let a = 10
a = 20 // Cannot assign to value: 'a' is a 'let' constant

注意:Dart 文档定义了两个关键字 finalconst,其工作方式如下:

如果您不打算更改变量值,请使用 finalconst,而不是 var 或类型。final 变量只能设置一次;const 变量是编译时常量。(Const 变量是隐式 final。)final 顶层类型变量或类变量在第一次使用时被初始化。

在 Dart 网站上的这篇文章中可以找到进一步的解释:

final 意味着一次赋值。final 变量或字段必须具有 initializer。 一旦赋值,就不能改变 final 变量的值。

在 Swift 中,我们用 let 声明常量。

常量声明会在程序中引入常量命名值。使用 let 关键字声明常量,并具有以下形式:

let constant name: type = expression

常量声明定义常量名称和初始化表达式值之间的不可变绑定;设置常量值后,无法更改。

函数

函数在 Swift 和 Dart 中都是一等公民。

这意味着就像对象一样,函数可以作为参数传递,保存为属性或作为结果返回。

作为初始比较,我们可以看到如何声明不带参数的函数。

在 Dart 中,返回类型在方法名称之前:

void foo();
int bar();

在 Swift 中,我们使用 -> T 表示法作为后缀。如果没有返回值(Void),则不需要这样做:

func foo()
func bar() -> Int

命名及未命名(un-named)参数

两种语言都支持命名和未命名的参数。

在 Swift 中,参数默认为命名参数

func foo(name: String, age: Int, height: Double)
foo(name: "Andrea", age: 34, height: 1.84)

在 Dart 中,我们使用花括号({})定义命名参数:

void foo({String name, int age, double height});
foo(name: 'Andrea', age: 34, height: 1.84);

在 Swift 中,我们使用下划线(_) 作为外部参数来定义未命名的参数:

func foo(_ name: String, _ age: Int, _ height: Double)
foo("Andrea", 34, 1.84)

在 Dart 中,我们通过省略花括号({})来定义未命名的参数:

void foo(String name, int age, double height);
foo('Andrea', 34, 1.84);

可选和默认参数

两种语言都支持默认参数。

在 Swift 中,您可以通过在该参数的类型之后为参数赋值来为函数中的任何参数定义默认值。如果定义了默认值,则可以在调用函数时省略该参数。

func foo(name: String, age: Int = 0, height: Double = 0.0) 
foo(name: "Andrea", age: 34) // name: "Andrea", age: 34, height: 0.0

在 Dart 中,可选参数可以是位置参数,也可以是命名参数,但不能同时。

// positional optional parameters
void foo(String name, [int age = 0, double height = 0.0]);
foo('Andrea', 34); // name: 'Andrea', age: 34, height: 0.0
// named optional para
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值