SWIFT基础语法(二)

来源:互联网 发布:淘宝物流重量 虚假交易 编辑:程序博客网 时间:2024/05/21 14:46

对象和类:

  • 类:使用class来创建一个类,类的名称附加在class之后,类中的属性声明和普通的变量和常量的声明是一样的,除非是在类的上下文中,方法和函数也是这么写。
class shape {               var simpleOfNumber = 7               func simpleDesciription() -> string {                                 return “the simple number is \(simpleOfNumber)”                }}//通过在类名后添加圆括号来实例化,使用.来访问实例属性和方法var myShape = shape()  //在类名后添加圆括号来实例化shape.simpleOfNumber = 34print(“myShape.simpleDesciription()”)//这个版本的shape类遗漏了一个重要的事情:用于在创建实例时设置类的构造器。使用init来创建这样的构造器。class NameShape {    var numberOfSides: Int = 0    var name: String    init(name: String) {        self.name = name   //通过self来区分name属性和构造器的name参数,构造器的参数如同调用函数一样,在实例化类的时候传入进来,所有属性都需要被赋值,无论在属性声明的时候,还是在构造器里,这个地方不懂。    }    func simpleDescription() -> String {        return "A shape with \(numberOfSides) sides."    }}//子类中的方法可以通过标记override来覆盖超类中的实现,没有override,编译器会视为错误,编译器同时也会检查那些带着override却没有覆盖任何超类方法的子类方法。除了保存简单的属性,属性还有一个getter 和一个setterclass EquilateralTriangle: NameShape {    var sideLength: Double = 0.0    init(sideLength: Double, name: String) {        self.sideLength = sideLength        super.init(name: name)        numberOfSides = 3    }    var perimeter: Double {        get {            return 3.0 * sideLength        }        set {            sideLength = newValue / 3.0        }    }    override func simpleDescription() -> String {        return "An equilateral triagle with sides of length \(sideLength)"    }}var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")triangle.perimetertriangle.perimeter = 9.9triangle.sideLength//如果需要对属性进行计算,但仍然需要提供在设置新值时的前置和后置的代码,可以用willSet和didSet,如下类要保证三角的边长和矩形的边长相等。类中的方法和函数有一个重要的区别,函数的参数名只在函数内部使用,但是方法的参数名在你调用方法的时候也会被使用(除了第一个参数),默认情况下,方法使用的参数和你调用方法时传递的参数同名,但是,你可以为方法的参数指定第二个名字,以供在方法内部使用。class Counter {    var count: Int = 0    func incrementBy(amount: Int, numberOfTimes times: Int) -> String{        count += amount * times        return "\(count)"    }}var counter = Counter()print(counter.incrementBy(2, numberOfTimes: 7))

枚举、结构体

  • 枚举与结构
    使用enum来创建一个枚举,和类以及其他命名类型一样,枚举可以包含方法
enum Rank: Int {    case Ace = 1    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten    case Jack, Queen, King    func simpleDescription() -> String {        switch self {        case .Ace:            return "ace"        case .Jack:            return "jack"        case .Queen:            return "queen"        case .King:            return "king"        default:            return String(self.rawValue)          }    }}let ace = Rank.Acelet aceRawValue = ace.rawValue//在上边的示例中,枚举的原始值(raw value)类型是int,所以你只需要指定第一个原始值。其后的原始值都是按照顺序赋值的,你还可以使用字符串或者浮点数作为枚举的原始值。当枚举提供的原始值没有实际意义的时候,可以不提供。//不提供原始值的枚举enum Suit {    case Spades, Hearts, Diamonds, Clubs    func simpleDescription() -> String {        switch self {        case .Spades:            return "spades"        case .Hearts:            return "hearts"        case .Diamonds:            return "diamonds"        case .Clubs:            return "clubs"        }    }    func anotherSimpleDescription() -> String {        switch self {        case .Spades, .Clubs:            return "black"        case .Hearts, .Diamonds:            return "red"        }    }}let hearts = Suit.Heartslet heartsDescription = hearts.simpleDescription()let anotherHearts = Suit.HeartsanotherHearts.anotherSimpleDescription()//上面引用hearts成员的两种方法:当给hearts常量赋值时,枚举成员suit.hearts通过全名引用,因为常量没有显示声明类型。在switch中,枚举通过.hearts引用,因为self的值是已知的。可以在值类型已知的情况下使用这种缩写。
  • 结构体
    通过struct创建结构体,结构体和类有很多相同的行为,包括方法和构造器。一大重要的区别是,结构体在代码中是通过拷贝来传递(值传递),而类则是引用传递。
//结构体struct Card {    var rank: Rank    var suit: Suit    func simpleDescription() -> String {        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"    }}let threeOfSpades = Card(rank: .Three, suit: .Spades)let threeOfSpadesDescription = threeOfSpades.simpleDescription()//一个枚举成员的实例可以拥有一个和实例对应的关联值,同一个枚举成员的实例可以有不同关联值与其对应。你在创建实例时提供关联值,关联值和原始值的区别:同一个枚举成员的所有实例的原始值都相同,在定义枚举时提供原始值。如下代码:从服务器获取太阳升起和落下时间,服务器响应具体的信息或错误信息//创建服务器时间函数enum ServerResponse {    case Result(String, String)    case Error(String)}let success = ServerResponse.Result("6:00 am", "8.09 pm")let failure = ServerResponse.Error("Out of cheese.")switch success {case let .Result(sunrise, sunset):    let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)"case let .Error(error):    let serverResponse = "Failure....\(error)"}
0 0
原创粉丝点击