Swift 3.0为C#开发人员解释

编程语言提供了一种通过符号指令与计算机进行通信的方法。Swift和C#是高级语言,通常归类于多范式和编译型编程语言。 它们不仅属于同一类编程语言,而且具有许多共同的语法功能。由于这种语法相似性,C#开发人员可以轻松地将Swift编程语言用于iOS,macOS,watchOS,tvOS和Linux开发。我们将精确地介绍C#和Swift之间的关键相似之处,

  • 常量和变量
  • 类和对象
  • 继承(类和协议)
  • 关闭
  • 泛型

和其他主要的Swift功能
您可以在IBM Swift Sandbox中试用swift代码段,该工具使任何人都可以从其浏览器编写和运行Swift代码。

const是let,而var仍然是var

常量是一个标识符,其值在程序正常执行期间无法修改。

在C#中,使用关键字const定义常量,并且定义常量的语法为

  const {Type} {ConstantName} =值; 
const int loginAttempts = 3;

在Swift中,使用let定义常量,并且明确定义类型是可选的,因为它根据通过类型推断提供的“值”来选择数据类型。

 让{ConstantName}:{Type} =值 
让loginAttempts = 3
让loginAttempts:Int = 3

在Swift中,每个语句末尾的分号(;)是可选的。 但是,如果要在一行上编写多个单独的语句,则需要分号。

 让loginAttempts = 3; 
打印(登录尝试)

注意:在C#中,定义常量符号时,其值必须在编译时即可确定。 而在Swift中,常量的值不需要在编译时就知道,而是必须在定义了显式类型的情况下将其值精确分配一次。

与C#相似, var是在Swift中定义变量的关键字。

  // C#-隐式键入局部变量 
var name =“ Sagar”;
  //迅速 
var name =“ Sagar”
var name:String =“ Sagar”

注意:作为C#,Swift 也是类型安全的。它在编译代码时执行类型检查并将所有不匹配的类型标记为错误。 这使您能够在开发过程中尽早发现并修复错误。

类和对象

是定义类型的数据和行为的蓝图。 对象是动态创建的类的实例,并分配了一块内存。 属性,方法,字段是类的成员。

在C#中,

  //类定义 
班级员工
{
//领域
私有字符串_employeeName;

//属性
公共字符串EmployeeName
{
得到{return _employeeName; }
设置{_employeeName =值; }
}

//构造函数或初始化程序
public Employee(字符串名称)
{
this.EmployeeName =名称;
}

//方法
公共字符串GetEmployee()
{
返回EmployeeName;
}

//析构函数
〜员工()
{
//清理语句
}
}
  //实例创建-对象 
var employee = new Employee(“ James”);
var employeeName = employee.GetEmployee();

同样,在Swift 3.0中

  //类定义 
班级员工
{
//属性
//类似于var,但在类中声明。
变量名称:字符串

//带有getter和setter的属性
var employeeName:字符串{
得到{
返回名称
}
设置{
名称= newValue
}
}

//初始化器或构造函数
init(name:String){
// self与C#中的'this'类似
self.name =名称
}

//方法
func getEmployee()->字符串{
返回employeeName
}

// DeInitializer
取消初始化
{

}

}
//实例创建-对象
var employee = Employee(名称:“琼斯”)
var employeeName = employee.getEmployee()
打印(employeeName)

在Swift Sandbox上尝试

注意: 方法是与特定类型关联的函数。 同样,如果一种方法接受多个参数,则可以使用与C#中相同的方式来使用命名参数 。 例如,var employee = Employee(名称:“ Jones”,Id:12345)。

类和接口(Swift中的协议)继承

继承是面向对象编程的主要支柱之一。 继承与代码的可重用性有关 。可以从现有类中创建一个新类。

  // C# 
// Manager称为Sub / Derived类。
//雇员被称为超级/基类。
班主任:员工
{
public Manager(String name):Base(name)//调用Employee(name)

//方法重写
//仅当基类中的方法标记为“虚拟”时
公共重写String GetEmployee(){...}
  } 
  //迅捷 
班主任:员工
{
覆盖init(name:String){
super.init(名称:名称)//呼叫Employee(名称)
}
//方法重写
覆盖func getEmployee()->字符串{...}
}

我们可以通过C#中的接口和Swift中的协议来实现多重继承 。 接口和协议只是合同,没有任何实现。 语法类似于类声明。

注意:使用final修饰符可防止覆盖 。 在Swift Sandbox上尝试

在C#中,

  //接口定义 
接口IProjectManager
{
字符串projectName {get; 组;}
Int GetDeveloperCount();

}
  //实施 
班级经理:员工,IProjectManager
{
//领域
私有字符串_name;

//属性
公共字符串projectName {
得到{
返回_name;
}
组{
_name =值;
}

//方法
公共Int GetDeveloperCount()
{
返回15;
}
}

在Swift 3.0中,

  //协议声明 
协议ProjectManager
{
var projectName:字符串{获取设置}
func getDeveloperCount()->整数
}
  //实施 
班长:员工,项目经理
{
//简单的属性
var managerName:字符串

覆盖init(name:String){
self.managerName =名称
super.init(名称:名称)//呼叫Employee(名称)
}

//带有getter和setter的属性
var projectName:字符串{
得到{
返回名称
}
 设置{ 
名称= newValue
}
}
  //方法 
func getDeveloperCount()-> Int {
返回15
}
}

Lambda是Swift中的闭包

在C#语言的3.0版中引入的Lambda表达式是一种返回方法的表达式。 Lambda表达式在C#中以以下基本形式表示,

(输入参数)=>表达式

在Swift中,闭包表达式采用以下一般形式:

{(参数)->返回类型
陈述
}

对任何开发人员来说,对名称列表进行排序都是一项艰巨的任务。 因此,这是一个展示Lambdas / Closures之美的示例。

在C#中,

注意:为了便于比较和理解,我在下面的代码段中使用C#Console应用程序。

 班级计划 
{
静态void Main(string [] args)
{
//名称列表
var names = new List {“ John”,“ Johnes”,“ Aria”,“ Amar”,“ Rajesh”,“ Xavier”};
names.Sort((s2,s1)=> s2.CompareTo(s1));
  foreach(名称中的变量名) 
{
Console.WriteLine(name);
  } 
Console.ReadLine();
}
}

在Visual Studio中运行代码后,您应该看到如下图所示的输出。

C#控制台应用程序输出。

在Swift 3.0中,

  //员工姓名列表 
var names = [“ John”,“ Johnes”,“ Aria”,“ Amar”,“ Rajesh”,“ Xavier”]
  //闭包表达式 
names = names.sorted(by:{{s1:String,s2:String)-> Bool in return s2> s1})
  // for-in循环 
以名称命名{
打印(名称)
}

在Swift Sandbox上尝试一下,以了解与Swift早期版本相比的Swift 3.0 API设计指南。

在IBM Swift Sandbox中看到的Swift输出(在浏览器中)

IBM Swift沙箱

泛型是Swift中的泛型

C#中的泛型

 班级计划 
{
//通用方法
静态void SwapTwoValues (ref T a,ref T b)
{
温度
temp = a;
a = b;
b =温度;
}
静态void Main(string [] args)
{
//交换两个值
整数a = 40,b = 60;
Console.WriteLine(“交换之前:{0},{1}”,a,b);
  SwapTwoValues (ref a,ref b); 
  Console.WriteLine(“交换后:{0},{1}”,a,b); 
  Console.ReadLine(); 
}
}
  ///定义一个通用函数来交换两个值 
func swapTwoValues (_ a:inout T,_ b:inout T){
设临时A = a
a = b
b =临时A
}

// swapTwoValues的用法
var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt,&anotherInt)
// \()-字符串插值
print(“交换之后:\(someInt),\(anotherInt)”)

注意:

  • 如果不想为函数的第二个或后续参数使用外部名称,请为该参数写下划线(_)而不是显式外部名称。
  • Swift使用字符串插值法将常量或变量的名称作为占位符包含在较长的字符串中,并提示Swift将其替换为该常量或变量的当前值。

除上述功能外,Swift还提供了一些强大的功能,这些功能使编码流畅且无错误。

  • 可选:可选说“有一个值,它等于x”或“根本没有一个值”。 在某种程度上,类似于C#中的Nullable类型,但Optionals更具表达性和安全性。 检查展开以了解我的意思。
  • 可选链接:考虑一种情况,在这种情况下,我们根据当前可能为零的Optional调用方法或与属性对话。 如果可选参数为nil,Swift提供了一个选项来优雅地削减方法调用或属性对话。 注意:可选链接是强制展开的替代方法
  • ARC:对象生命周期管理对开发人员来说是一项开销,因为它直接影响内存管理,从而影响应用程序性能。以下是自动引用计数(ARC)的解决方法,当不再需要实例时,ARC会释放该实例使用的内存,以便该内存可用于其他目的。 这样可以确保不再需要类实例时,它们不会占用内存空间。 看起来像.NET世界中的垃圾回收(GC),但是方法不同。 哪一个更好? 答案总是有争议的。
  • 警卫:警卫是有条件的声明,如果不满足条件,则有助于提前退出 。 与if语句不同,guard语句始终具有else子句-如果条件不成立,则执行else子句中的代码。 同样,使用保护性绑定作为条件的一部分分配了值的任何变量或常量都可用于保护语句出现在其中的其余代码块。
  • 属性观察者:观察并响应属性值的变化,称为属性观察者。 即使新值与属性的当前值相同,每次设置属性值时都会调用属性观察器。您可以选择在属性上定义这两个观察者中的一个或两个:
  • 将在存储值之前调用willSet。
  • 存储新值后,将立即调用didSet。
  • 初始化器中设置属性时,无法调用willSet和didSet。

到目前为止,我们所讨论的只是沧海一粟。 在C#和Swift中,有许多功能具有相似的语法。 结构,枚举,循环(控制流)是您可以探索的其中很少的内容,如果您感到惊讶,可以在下面的评论部分中随意发表评论。

下一步是什么? 查看官方Swift文档和API设计指南

此外,为云构建功能强大,快速且安全的服务器端Swift应用

雨燕快乐!