Swift,蘋果於2014年WWDC(蘋果開發者大會)發布的新開發語言,可與Objective-C*共同運行於macOS和iOS平台,用於搭建基於蘋果平台的應用程式。
Swift是一款易學易用的程式語言,而且它還是第一套具有與腳本語言同樣的表現力和趣味性的系統程式語言。Swift的設計以安全為出發點,以避免各種常見的編程錯誤類別。
2015年12月4日,蘋果公司宣布其Swift程式語言現在開放原始碼。長600多頁的 The Swift Programming Language 可以線上免費下載。
基本介紹
- 中文名:雨燕
- 外文名:Swift
- 發布時間:2014年6月2日
- 發行組織:Apple
- 源於:Objective-C
- 系統:macOS, iOS , linux
- 參考語言:C、JavaScript、Python、Java
發展歷史
套用範圍
操作優點
套用優勢
示例程式
print("Hello,world")
主要功能
語法簡便
其他功能
- 閉包的統一與函式指針
- 元組和多個返回值
- 泛型
- 快速而簡潔的疊代範圍或集合
- 支持的方法,擴展的協定結構。
- 函式式編程模式,例如:映射(map)和過濾器(filter)
互動遊樂
- 設計一種新的算法,看其工作的每一步
- 創建新的測試,驗證他們推動到您的測試套件前工作
- 嘗試新的API來磨練你的Swift的編碼技巧
REPL
專為安全
高效強大
學習入門
Hello world
簡單值
var myVariable = 42 myVariable = 50let myConstant = 42
let implicitInteger = 70let implicitDouble = 70.0let explicitDouble: Double = 70
let label = "The width is"let width = 94let widthLabel = label + String(width)
let apples = 3let oranges = 5let appleSummary = "I have \(apples) apples."let fruitSummary = "I have \(apples + oranges) pieces of fruit."
var shoppingList = ["catfish", "water", "tulips", "blue paint"] shoppingList[1] = "bottle of water"// ["catfish", "bottle of water", "tulips", "blue paint"]var occupations = [ "Malcolm": "Captain", "Kaylee": "Mechanic",] occupations["Jayne"] = "Public Relations"/*[ "Malcolm": "Captain", "Kaylee": "Mechanic", "Jayne": "Public Relations",]*/
let emptyArray = [String]()let emptyDictionary = Dictionary<String, Float>()
shoppingList = [] // 去逛街並買點東西
控制流
let individualScores = [75, 43, 103, 87, 12]var teamScore = 0for score in individualScores { if score > 50 { teamScore += 3 } else { teamScore += 1 }}print(teamScore) //11
var optionalString: String? = "Hello" optionalString == nil // falsevar optionalName: String? = "John Appleseed"var greeting = "Hello!"if let name = optionalName { greeting = "Hello, \(name)" //Hello, John Appleseed}
let vegetable = "red pepper"switch vegetable { case "celery": let vegetableComment = "Add some raisins and make ants on a log." case "cucumber", "watercress": let vegetableComment = "That would make a good tea sandwich." case let x where x.hasSuffix("pepper"): let vegetableComment = "Is it a spicy \(x)?" default: let vegetableComment = "Everything tastes good in soup."}
let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25],]var largest = 0for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number } }}print(largest)
var n = 2while n < 100 { n = n * 2}pirnt(n)var m = 2repeat { m = m * 2} while m < 100print(m)// 你可以在循環中使用..<來表示範圍:[0, 1, 2]var firstForLoop = 0for i in 0..<3 { firstForLoop += i}print(firstForLoop)
函式閉包
func greet(name: String, day: String) -> String { return "Hello \(name), today is \(day)."}greet(name: "Bob", day: "Tuesday")
func getGasPrices() -> (Double, Double, Double) { return (3.59, 3.69, 3.79)}getGasPrices()
func sumOf(numbers: Int...) -> Int { var sum = 0 for number in numbers { sum += number } return sum}sumOf() // 0sumOf(numbers:42, 597, 12) // 651
func returnFifteen() -> Int { var y = 10 func add() { y += 5 } add() return y}returnFifteen() // 15
func makeIncrementer() -> ((Int) -> Int) { func addOne(number: Int) -> Int { return 1 + number } return addOne}var increment = makeIncrementer()increment(7) // 8
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool { for item in list { if condition(item) { return true } } return false}func lessThanTen(number: Int) -> Bool { return number < 10}var numbers = [20, 19, 7, 12]hasAnyMatches(list: numbers, condition: lessThanTen)
numbers.map({ (number: Int) -> Int in let result = 3 * number return result})
numbers.map({ number in 3 * number })
sort([1, 5, 3, 12, 2]) { $0 > $1 }
對象和類
class Shape { var numberOfSides = 0 func simpleDescription() -> String { return "A shape with \(numberOfSides) sides." }}
var shape = Shape() shape.numberOfSides = 7var shapeDescription = shape.simpleDescription()
class NamedShape { var numberOfSides: Int = 0 var name: String init(name: String) { self.name = name } func simpleDescription() -> String { return "A shape with \(numberOfSides) sides." }}
class Square: NamedShape { var sideLength: Double init(sideLength: Double, name: String) { self.sideLength = sideLength super.init(name: name) numberOfSides = 4 } func area() -> Double { return sideLength * sideLength } override func simpleDescription() -> String { return "A square with sides of length \(sideLength)." }}let test = Square(sideLength: 5.2, name: "my test square")test.area()test.simpleDescription()
class EquilateralTriangle: NamedShape { 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")print(triangle.perimeter)triangle.perimeter = 9.9print(triangle.sideLength)
class TriangleAndSquare { var triangle: EquilateralTriangle { willSet { square.sideLength = newValue.sideLength } } var square: Square { willSet { triangle.sideLength = newValue.sideLength } } init(size: Double, name: String) { square = Square(sideLength: size, name: name) triangle = EquilateralTriangle(sideLength: size, name: name) }}var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")pirnt(triangleAndSquare.square.sideLength)print(triangleAndSquare.triangle.sideLength)triangleAndSquare.square = Square(sideLength: 50, name: "larger square")print(triangleAndSquare.triangle.sideLength)
class Counter { var count: Int = 0 func incrementBy(amount: Int, numberOfTimes times: Int) { count += amount * times }}var counter = Counter()counter.incrementBy(2, numberOfTimes: 7)
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")let sideLength = optionalSquare?.sideLength
枚舉
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.toRaw()) } }}let ace = Rank.Acelet aceRawValue = ace.toRaw()
if let convertedRank = Rank.fromRaw(3) { let threeDescription = convertedRank.simpleDescription()}
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" } }}let hearts = Suit.Heartslet heartsDescription = hearts.simpleDescription()
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)"}
接口擴展
protocol ExampleProtocol { var simpleDescription: String { get } mutating func adjust()}
class SimpleClass: ExampleProtocol { var simpleDescription: String = "A very simple class." var anotherProperty: Int = 69105 func adjust() { simpleDescription += " Now 100% adjusted." }}var a = SimpleClass()a.adjust()let aDescription = a.simpleDescriptionstruct SimpleStructure: ExampleProtocol { var simpleDescription: String = "A simple structure" mutating func adjust() { simpleDescription += " (adjusted)" }}var b = SimpleStructure()b.adjust()let bDescription = b.simpleDescription
extension Int: ExampleProtocol { var simpleDescription: String { return "The number \(self)" } mutating func adjust() { self += 42 }}7.simpleDescription
let protocolValue: ExampleProtocol = a protocolValue.simpleDescription// protocolValue.anotherProperty // Uncomment to see the error
泛型
func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] { var result = ItemType[]() for i in 0..<times { result += item } return result}repeat("knock", 4)// 你也可以創建泛型類、枚舉和結構體。// Reimplement the Swift standard library's optional typeenum OptionalValue<T> { case None case Some(T)}var possibleInteger: OptionalValue<Int> = .None possibleInteger = .Some(100)
func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element:Equatable, T.GeneratorType.Element == U.GeneratorType.Element> (lhs: T, rhs: U) -> Bool { for lhsItem in lhs { for rhsItem in rhs { if lhsItem == rhsItem { return true } } } return false}anyCommonElements([1, 2, 3], [3])