SWIFT基础语法(二)

对象和类:

  • 类:使用class来创建一个类,类的名称附加在class之后,类中的属性声明和普通的变量和常量的声明是一样的,除非是在类的上下文中,方法和函数也是这么写。
class shape {
               var simpleOfNumber = 7
               func simpleDesciription() -> string {
                                 return “the simple number is \(simpleOfNumber)”
                }
}
//通过在类名后添加圆括号来实例化,使用.来访问实例属性和方法
var myShape = shape()  //在类名后添加圆括号来实例化
shape.simpleOfNumber = 34
print(“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 和一个setter
class 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.perimeter

triangle.perimeter = 9.9

triangle.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.Ace
let 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.Hearts
let heartsDescription = hearts.simpleDescription()
let anotherHearts = Suit.Hearts
anotherHearts.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)"

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值