赞
踩
| 作者:Andrea Bizzotto
| 原文链接:medium.com/coding-with…
Dart 和 Swift 是我最喜欢的编程语言。我在商业和开源代码中广泛使用它们。
本文提供了 Dart 和 Swift 之间的比较,旨在:
一些背景:
以下是两种语言的主要特征(Dart 2.1
和 Swift 4.2
)的比较。由于深入讨论每个功能超出了本文的范围,因此更多的信息可以参考各自的文档。
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 文档定义了两个关键字 final
和 const
,其工作方式如下:
如果您不打算更改变量值,请使用
final
或const
,而不是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
两种语言都支持命名和未命名的参数。
在 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。