在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
面向过程 数据结构3.1 常量和变量定义常量和变量let a = 1 显式定义和隐式定义无需指定强类型,编译器会自动根据初始值推断出其类型。与c#相似。如果在定义时不初始化,则必须显式定义 可选变量类似C#的可空类型。 var str1:String?//默认为nil 处理变量的可选值时,你可以在操作(比如方法、属性和子脚本)之前加?。如果?之前的值是nil,?后面的东西都会被忽略,并且整个表达式返回nil。否则,?之后的东西都会被运行。在这两种情况下,整个表达式的值也是一个可选值。 let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") 你可以使用if语句来判断一个可选是否包含值。如果可选有值,结果是true;如果没有值,结果是false。 if convertedNumber { 使用!来获取一个不存在的可选值会导致运行时错误。使用!来强制解析值之前,一定要确定可选包含一个非nil的值。 Swift 的nil和 Objective-C 中的nil并不一样。在 Objective-C 中,nil是一个指向不存在对象的指针。在 Swift 中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选都可以被设置为nil,不只是对象类型。 下面的例子展示了可选String和隐式解析可选String之间的区别: let possibleString: String? = "An optional string." let assumedString: String! = "An implicitly unwrapped optional string." 支持utf8 unicode字符集变量名或常量名支持utf8字符集 3.2注释和分号多行注释支持嵌套 3.3基本数据类型字符串和字符var ch = "u"//默认类型推断出是字符串 元组类型 tuplets由于函数返回值需要返回多个值,但是又不期望单独去创建一个结构体或类型,这个时候则可以使用元组类型,从而减少对象的创建。 可以通过下标访问元组的项。 通过声明元组类型变量获取 3.4基本运算符需要注意的是,有些运算符需要空格隔开,不然ide会抛出错误提示。 赋值运算符算数运算符+-*/% 比较运算符== 和 === 区别不要和Javascript 混淆。前者是内容值相等比较,后者是引用地址值相等比较。 三目运算符逻辑运算符3.5集合类型数组array字典dictianary用for-in来遍历字典 let interestingNumbers = [ 3.6控制流for in你可以在循环中使用..来表示范围,也可以使用传统的写法,两者是等价的: var firstForLoop = 0 var secondForLoop = 0 if elsevar str1:String?=nil 还可以借助if let 条件判断的同时进行赋值 whiledo whileswitch和其他语言不一样的是,break不需要的,swift里默认就是 break,case执行完成之后跳出整个switch。 3.7函数一般参数func setUser1 (username:String , age:Int) -> void { 外部参数func setUser2 (user username:String , age:Int) -> void { func setUser3 (#username:String , age:Int) -> void { 参数默认值参数可设置默认值,这和C#4.0有着相同之处。 //当调用函数时传入有默认值的参数,该参数自动变为外部参数 可变参数func join(strs:String...) -> String{ Join("str1","str2","str3") 输入输出参数类似C#中的 ref 关键字,也就是引用参数传递。 var user = "user1" 函数类型类似C#中的委托,函数指针,传递函数。 函数嵌套类似javascript的函数包含函数,javascript的闭包。 3.8 闭包类似C#里的匿名函数表达式。 3.9 枚举类型使用enum来创建一个枚举。就像类和其他所有命名类型一样,枚举可以包含方法。 enum Rank: Int { 实例值定义//todo 在上面的例子中,枚举原始值的类型是Int,所以你只需要设置第一个原始值。剩下的原始值会按照顺序赋值。你也可以使用字符串或者浮点数作为枚举的原始值。 使用toRaw和fromRaw函数来在原始值和枚举值之间进行转换。 if let convertedRank = Rank.fromRaw(3) { 原始值定义enum Status:Int{ 面向对象的数据结构3.10 类类的实例的创建实例化不需要new,这和其他语言不大一样。 class User {
} var user1 = User() 类的构造函数和析构函数class User {
} var user1 = User(name:"user1")//构造函数的参数默认就是外部参数 类的继承支持多继承 //todo 类中的方法类中的方法和一般的函数有一个重要的区别,函数的参数名只在函数内部使用,但是方法的参数名需要在调用的时候显式说明(除了第一个参数)。默认情况下,方法的参数名和它在方法内部的名字一样,不过你也可以定义第二个名字,这个名字被用在方法内部。 class Counter { 3.11结构体struct User {
} 调用方式有2种 结构体与类的区别:
3.12协议类、枚举和结构体都可以实现接口。 mutating关键字用来标记一个会修改结构体的方法 协议的继承协议类似其他语言里的接口,同时,和C#的接口可以继承接口一样,swift的协议也是可以继承协议的。定义的方式也和C#相似太多。 protocol IEntityBase { 协议的合成// todo 扩展方法和C#扩展方法类似。 使用extension来为现有的类型添加功能,比如添加一个计算属性的方法。你可以使用扩展来给任意类型添加协议,甚至是你从外部库或者框架中导入的类型。 extension Int: ExampleProtocol { 3.13范型 |
请发表评论