swift編程教程
A. 如何在 Swift 中使用 Alamofire 進行網路編程
在終端中鍵入以下命令:
git init
git add .
git commit -m "First Commit"
這三行命令,初始化了一個倉庫(repository,簡寫為 repo),並添加了當前目錄下的所有文件到這個倉庫,最終提交並保存。
git 是一款很流行的版本控制軟體。
現在你可以看終端里應該和下圖的內容差不多:
因為你之前已經成功安裝了 heroku toolbelt,所以你現在可以在終端里鍵入 heroku login ,並輸入帳號密碼。敲回車後繼續,如果帳號密碼沒問題的話,你的 Email 會以藍綠色高亮顯示。
現在,鍵入 heroku create 來創建一個新的 heroku 應用。Heroku 會創建一個新的帶有域名的應用給你。比如,我的就是 https://whispering-plains-1537.herokuapp.com/。
現在,鍵入 git push heroku master 來把你新建的應用發送到 heroku。
如果一切順利的話,會顯示如下圖(其中的某一些設置可能會不同)。
使用 Node.js, Express, MongoLab & Mongoose
讓我們從下載示例工程開始, 鏈接在這里 。打開你最喜歡的文本編輯器(我這邊用的是 Sublime Text 2;可以在 這里 下載免費版,如果你支持的話也可以購買),然後繼續。
Javascript 在很大程度上是和 Swift 很相似的。我們之後會使用 express 和 mongoose 兩個著名 node 包。請確保你已經在系統上安裝 npm 和 node 包管理器。
Express 是 Node.js 中的一個「快速、強大而又輕量級」的網路框架,它可以輕松解決路由(Route)問題。你問什麼是路由?路由就是你與網路交互的方式。每次你打開 google.com 的時候,其實你訪問的是根主頁,即 google.com/。假如你訪問 google.com/hello,那就是另外一個路由了。我們接下來將要定義一個能訪問我們資料庫的路由。
你可以從 expressjs.org 官網上學習更多關於 express 的知識。
下面是示例代碼:
var express = require('express'); // 1
var app = express(); // 2
// 當一個 GET 請求訪問主頁的時候,會返回 hello world
app.get('/', function(req, res) { // 3
res.send('hello world'); // 4
});
第一行代碼設置了一個叫 express 的變數。第二行代碼,把 express 初始化後賦值給一個叫 app 的變數。在第三行代碼,app 這個變數代表了 express 環境,調用它的 get() 方法(形式類似 Swift)。當一個用戶訪問 / 根主頁的時候,就會顯示「hello world」。這是 express 作為路由的一個例子。如果需要更多信息,可以訪問 express 官網 查看。
現在,我們已經配置好了 mongo 資料庫的環境,接下來讓我們來使用 cURL 請求測試一下功能。cURL 是一款命令行程序,它可以發送 HTTP 請求。我們將會先使用 cURL 做一下實驗,然後再遷移到 Alamofire 去。
JavaScript 介紹
模型
打開你的文本編輯器(再次順便說一下,我用的是 Sublime),同時打開 app.js 文件。正如你看到的,應用被分割成了一個 model 和路由文件(就是你剛打開的 app.js 文件)。model 文件可以建立模式(schema)或資料庫結構。讓我們先來簡單看看這個文件吧。
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var TodoSchema = new Schema(
{
name: String
});
mongoose.model('employees', TodoSchema);
我們可以使用 mongoose,它是一個用在應用與 mongo 之間作為介面的 npm 包。我起初在構建一個僱工跟蹤應用,並把 model 命名為 employee,但是可能會隨時修改這個 model。我保留著它,是因為這個教程的接下來部分可能會用到。
Mongoose 能很方便的提供與 mongoLab 的 heroku node 應用連接並提供相應的介面。這的確非常方便。
B. 如何更好的學習Swift編程
建議考慮時下火爆的python,python不僅入門簡單,靈活高效。更是在人工智慧方面應用廣泛,對將來大有裨益。
C. 如何用swift編寫函數的代碼
我們打開xcode6,新建一個工程項目。
注意在語言選擇這里,現在新增了一個swift的選項,當然我們現在要選擇swift,然後繼續。
展開項目的目錄,我們可以看到xcode為我們默認生成的程序文件,注意.swift擴展名的就是。
我們先打開storyboard添加一個label
然後我們打開ViewController.swift文件,然後按住ctrl鍵拖拽label到viewcontroller里,創建一個outlet。
現在我們通過swift變成來實現label的變化。簡單了解一下swift的格式。
func NAME (){}
我們這里設置了label的文本內容為「hello,swift」,同時設置了文本內容的顏色為紅色。
添加執行代碼到所示的位置。
執行效果。
D. 自學Swift開發的書籍推薦
《Swift語言實戰精講》,除了看書多去網上找一些基礎的視頻進行學習,能夠更容易理解與上手,像【首發】Swift開發系列視頻教程、IOS8-秒學Swift開發語言(坐標系學習法)視頻課程都是不錯的。
E. 怎麼利用xcode開發swift應用程序
簡單介紹
xcode集成開發環境是運行於Mac蘋果電腦上用於開發swift應用程序的工具,利用xcode可以很方便、直觀的開發OS X和iOS系統所支持的應用程序。
步驟詳解
必須在蘋果Mac電腦上搭建xcode開發環境。
打開「xcode」開發工具,點擊「File」->「New」->「Project」項來創建一個新的工程。
在打開的「創建工程」向導界面中,選擇「OS X」系統中的「Application」項,選中「Command Line Tool」項,點擊「Next」按鈕來創建一個基於OS X系統的命令行應用程序。
接著輸入「Project Name」(工程名稱)和「Language」(語言)。
然後直接點擊「Create」按鈕創建應用程序。
F. SWIFT的學習入門
第一個程序應該在屏幕上列印「Hello, world」。在 Swift 中,可以用一行代碼實現:
println("Hello, world")
如果你寫過 C 或者 Objective-C 代碼,那你應該很熟悉這種形式——在 Swift 中,這行代碼就是一個
完整的程序。你不需要為了輸入輸出或者字元串處理導入一個單獨的庫。全局作用域中的代碼會被自動當
做程序的入口點,所以你也不需要main函數。你同樣不需要在每個語句結尾寫上分號。
這個教程會通過一系列編程例子來讓你對 Swift 有初步了解,如果你有什麼不理解的地方也不用擔心—
—任何本章介紹的內容都會在後面的章節中詳細講解。
注意:
為了獲得最好的體驗,在 Xcode 當中使用代碼預覽功能。代碼預覽功能可以讓你編輯代碼並實時看到運
行結果。 使用let來聲明常量,使用var來聲明變數。一個常量的值在編譯時並不需要獲取,但是你只能為它賦值一
次。也就是說你可以用常量來表示這樣一個值:你只需要決定一次,但是需要使用很多次。
var myVariable = 42
myVariable = 50
let myConstant = 42
常量或者變數的類型必須和你賦給它們的值一樣。然而,聲明時類型是可選的,聲明的同時賦值的話,編
譯器會自動推斷類型。在上面的例子中,編譯器推斷出myVariable是一個整數(integer)因為它的初始
值是整數。
如果初始值沒有提供足夠的信息(或者沒有初始值),那你需要在變數後面聲明類型,用冒號分割。
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
創建一個常量,顯式指定類型為Float並指定初始值為4。
值永遠不會被隱式轉換為其他類型。如果你需要把一個值轉換成其他類型,請顯式轉換。
let label = "The width is"
let width = 94
let widthLabel = label + String(width)
刪除最後一行中的String,錯誤提示是什麼?
有一種更簡單的把值轉換成字元串的方法:把值寫到括弧中,並且在括弧之前寫一個反斜杠。例如:
let apples = 3
let oranges = 5
let appleSummary = "I have (apples) apples."
let fruitSummary = "I have (apples + oranges) pieces of fruit."
使用()來把一個浮點計算轉換成字元串,並加上某人的名字,和他打個招呼。
使用方括弧[]來創建數組和字典,並使用下標或者鍵(key)來訪問元素。
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"
要創建一個空數組或者字典,使用初始化語法。
let emptyArray = [String]()
let emptyDictionary = Dictionary<String, Float>()
如果類型信息可以被推斷出來,你可以用[]和[:]來創建空數組和空字典——就像你聲明變數或者給函數
傳參數的時候一樣。
shoppingList = [] // 去逛街並買點東西 使用if和switch來進行條件操作,使用for-in、for、while和do-while來進行循環。包裹條件和循環變
量括弧可以省略,但是語句體的大括弧是必須的。
let indivialScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in indivialScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
teamScore
在if語句中,條件必須是一個布爾表達式——這意味著像if score { ... }這樣的代碼將報錯,而不會隱
形地與 0 做對比。
你可以一起使用if和let來處理值缺失的情況。有些變數的值是可選的。一個可選的值可能是一個具體的
值或者是nil,表示值缺失。在類型後面加一個問號來標記這個變數的值是可選的。
var optionalString: String? = "Hello"
optionalString == nil
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, (name)"
}
把optionalName改成nil,greeting會是什麼?添加一個else語句,當optionalName是nil時給greeting
賦一個不同的值。
如果變數的可選值是nil,條件會判斷為false,大括弧中的代碼會被跳過。如果不是nil,會將值賦給let
後面的常量,這樣代碼塊中就可以使用這個值了。
switch支持任意類型的數據以及各種比較操作——不僅僅是整數以及測試相等。
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."
}
刪除default語句,看看會有什麼錯誤?
運行switch中匹配到的子句之後,程序會退出switch語句,並不會繼續向下運行,所以不需要在每個子句
結尾寫break。
你可以使用for-in來遍歷字典,需要兩個變數來表示每個鍵值對。
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
}
}
}
largest
添加另一個變數來記錄哪種類型的數字是最大的。
使用while來重復運行一段代碼直到不滿足條件。循環條件可以在開頭也可以在結尾。
var n = 2
while n < 100 {
n = n * 2
}
n
var m = 2
do {
m = m * 2
} while m < 100
m
你可以在循環中使用..<來表示範圍,也可以使用傳統的寫法,兩者是等價的:
var firstForLoop = 0
for i in 0..<3 {
firstForLoop += i
}
firstForLoop
var secondForLoop = 0
for var i = 0; i < 3; ++i {
secondForLoop += 1
}
secondForLoop
使用..<創建的范圍不包含上界,如果想包含的話需要使用...。 使用func來聲明一個函數,使用名字和參數來調用函數。使用->來指定函數返回值。
func greet(name: String, day: String) -> String {
return "Hello (name), today is (day)."
}
greet("Bob", "Tuesday")
刪除day參數,添加一個參數來表示今天吃了什麼午飯。
使用一個元組來返回多個值。
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()
sumOf(42, 597, 12)
函數可以嵌套。被嵌套的函數可以訪問外側函數的變數,你可以使用嵌套函數來重構一個太長或者太復雜
的函數。
func returnFifteen() -> Int {
var y = 10
func add() {
y += 5
}
add()
return y
}
returnFifteen()
函數是第一等類型,這意味著函數可以作為另一個函數的返回值。
func makeIncrementer() -> (Int -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
函數也可以當做參數傳入另一個函數。
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(numbers, lessThanTen)
函數實際上是一種特殊的閉包,你可以使用{}來創建一個匿名閉包。使用in將參數和返回值類型聲明與閉
包函數體進行分離。
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和類名來創建一個類。類中屬性的聲明和常量、變數聲明一樣,唯一的區別就是它們的上下文
是類。同樣,方法和函數聲明也一樣。
class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with (numberOfSides) sides."
}
}
要創建一個類的實例,在類名後面加上括弧。使用點語法來訪問實例的屬性和方法。
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
這個版本的Shape類缺少了一些重要的東西:一個構造函數來初始化類實例。使用init來創建一個構造器
。
class NamedShape {
var numberOfSides: Int = 0
var name: String
init(name: String) {
self.name = name
}
func simpleDescription() -> String {
return "A shape with (numberOfSides) sides."
}
}
注意self被用來區別實例變數。當你創建實例的時候,像傳入函數參數一樣給類傳入構造器的參數。每個屬性都需要賦值——無論是通過聲明(就像numberOfSides)還是通過構造器(就像name)。如果你需要在刪除對象之前進行一些清理工作,使用deinit創建一個析構函數。子類的定義方法是在它們的類名後面加上父類的名字,用冒號分割。創建類的時候並不需要一個標準的根類,所以你可以忽略父類。
子類如果要重寫父類的方法的話,需要用override標記——如果沒有添加override就重寫父類方法的話編譯器會報錯。編譯器同樣會檢測override標記的方法是否確實在父類中。
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()
創建NamedShape的另一個子類Circle,構造器接收兩個參數,一個是半徑一個是名稱,實現area和
describe方法。
屬性可以有 getter 和 setter 。
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")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength
在perimeter的 setter 中,新值的名字是newValue。你可以在set之後顯式的設置一個名字。
注意EquilateralTriangle類的構造器執行了三步:
設置子類聲明的屬性值
調用父類的構造器
改變父類定義的屬性值。其他的工作比如調用方法、getters和setters也可以在這個階段完成。
如果你不需要計算屬性但是需要在設置一個新值之前運行一些代碼,使用willSet和didSet。
比如,下面的類確保三角形的邊長總是和正方形的邊長相同。
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")
triangleAndSquare.square.sideLength
triangleAndSquare.triangle.sideLength
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
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)
處理變數的可選值時,你可以在操作(比如方法、屬性和子腳本)之前加?。如果?之前的值是nil,?後面
的東西都會被忽略,並且整個表達式返回nil。否則,?之後的東西都會被運行。在這兩種情況下,整個表
達式的值也是一個可選值。
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare?.sideLength 使用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.toRaw())
}
}
}
let ace = Rank.Ace
let aceRawValue = ace.toRaw()
寫一個函數,通過比較它們的原始值來比較兩個Rank值。
在上面的例子中,枚舉原始值的類型是Int,所以你只需要設置第一個原始值。剩下的原始值會按照順序
賦值。你也可以使用字元串或者浮點數作為枚舉的原始值。
使用toRaw和fromRaw函數來在原始值和枚舉值之間進行轉換。
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.Hearts
let heartsDescription = hearts.simpleDescription()
給Suit添加一個color方法,對spades和clubs返回「black」,對hearts和diamonds返回「red」。
注意,有兩種方式可以引用Hearts成員:給hearts常量賦值時,枚舉成員Suit.Hearts需要用全名來引用
,因為常量沒有顯式指定類型。在switch里,枚舉成員使用縮寫.Hearts來引用,因為self的值已經知道
是一個suit。已知變數類型的情況下你可以使用縮寫。
使用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()
給Card添加一個方法,創建一副完整的撲克牌並把每張牌的 rank 和 suit 對應起來。
一個枚舉成員的實例可以有實例值。相同枚舉成員的實例可以有不同的值。創建實例的時候傳入值即可。
實例值和原始值是不同的:枚舉成員的原始值對於所有實例都是相同的,而且你是在定義枚舉的時候設置
原始值。
例如,考慮從伺服器獲取日出和日落的時間。伺服器會返回正常結果或者錯誤信息。
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)"
}
給ServerResponse和switch添加第三種情況。
注意如何從ServerResponse中提取日升和日落時間。 使用protocol來聲明一個介面。
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.simpleDescription
struct SimpleStructure: ExampleProtocol {
var simpleDescription: String = "A simple structure"
mutating func adjust() {
simpleDescription += " (adjusted)"
}
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
寫一個實現這個介面的枚舉。
注意聲明SimpleStructure時候mutating關鍵字用來標記一個會修改結構體的方法。SimpleClass的聲明
不需要標記任何方法因為類中的方法經常會修改類。
使用extension來為現有的類型添加功能,比如添加一個計算屬性的方法。你可以使用擴展來給任意類型
添加協議,甚至是你從外部庫或者框架中導入的類型。
extension Int: ExampleProtocol {
var simpleDescription: String {
return "The number (self)"
}
mutating func adjust() {
self += 42
}
}
7.simpleDescription
給Double類型寫一個擴展,添加absoluteValue功能。
你可以像使用其他命名類型一樣使用介面名——例如,創建一個有不同類型但是都實現一個介面的對象集
合。當你處理類型是介面的值時,介面外定義的方法不可用。
let protocolValue: ExampleProtocol = a
protocolValue.simpleDescription
// protocolValue.anotherProperty // Uncomment to see the error
即使protocolValue變數運行時的類型是simpleClass,編譯器會把它的類型當做ExampleProtocol。這表
示你不能調用類在它實現的介面之外實現的方法或者屬性。 在尖括弧里寫一個名字來創建一個泛型函數或者類型。
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 type
enum OptionalValue<T> {
case None
case Some(T)
}
var possibleInteger: OptionalValue<Int> = .None
possibleInteger = .Some(100)
在類型名後面使用where來指定一個需求列表——例如,要限定實現一個協議的類型,需要限定兩個類型
要相同,或者限定一個類必須有一個特定的父類。
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])
修改anyCommonElements函數來創建一個函數,返回一個數組,內容是兩個序列的共有元素。
簡單起見,你可以忽略where,只在冒號後面寫介面或者類名。<T: Equatable>和<T where T:Equatable>是等價的。

G. 編程零基礎如何學習 Swift
現在編程在我們生活中越來越多,有很多很都想學編程技術,但是因為都是剛接觸,不知道怎麼學習。但如果是想學編程,又還沒任何基礎,我能給的建議是:
1、想清楚自己的目的。
是為了充實自己,還是自己內心對計算機(不只是電腦)的渴望?如果是充實自己,那除了編程之外的基礎東西也夠學習了解很長一段時間了,比如計算機網路,計算機硬體,計算機歷史,計算機基礎結構等。同時這樣內容也是計算機專業的學生在大學里主修的課程。如果是對計算機的迷戀或者渴望,那就好辦了。興趣是最偉大的老師。以上的內容你都可以根據一個大學課程的安排選中自己想要了解的方向,深入學習。
總結:
計算機領域從概念,知識,體系架構,語言變成,運維整個過程,知識體系比較龐大,編程只是其中一個環節和領域,要做好,需總結,要了解上下文關系,體系知識關系。這些知識的培養與積累都是要在不斷的學習實踐過程中總結的。希望你在計算機領域能滿足自己的好奇心,也能創造更大的價值和成就。H. 如何用swift開發ios應用
swift開發ios應用步驟:
創建模板
app創建用戶界面之前,要先創建app的模板。一個模板就是一個類。
打開TipCalculator.swift,並把TipCalculator類從上一個項目中復制過來。
把類重命名為TipCalculatorModel,把常量total和taxPct改為變數,把subtotal變為一個computed property。
創建視圖
Navigation bar。現在添加一個Navigation bar,選擇視圖控制器接著下面步驟EditorEmbed InNavigation Controller。
Labels。從對象庫中拖動一個Labels到你的視圖控制器。
Text Field。從對象庫中拖動一個Text Field到你的視圖控制器。在屬性檢查器中,設置Keyboard Type=Decimal Pad。
Slider。從對象庫中拖動一個Slider到您的視圖控制器。
Auto Layout。 Interface Builder會自動地為你的自動布局做大量的合理自動布局的設置。
I. swift socket編程怎麼弄
swift代碼:需要導入GCDAsyncSocket庫文件,可去github下載
import UIKit
class ViewController:
UIViewController,
GCDAsyncSocketDelegate {
@IBOutlet var serveripInput:
UITextField!
@IBOutlet var msgInput:
UITextField!
@IBOutlet var conBtn:
UIButton!
@IBOutlet var sendBtn:
UIButton!
@IBOutlet var msgView:
UITextView!
let serverPort: UInt16 =
9050
var clientSocket:
GCDAsyncSocket!
var mainQueue =
dispatch_get_main_queue()
override func viewDidLoad() {
super.viewDidLoad()
}
//連接伺服器按鈕事件
@IBAction func conBtnClick(sender:
AnyObject) {
do {
clientSocket = GCDAsyncSocket()
clientSocket.delegate =
self
clientSocket.delegateQueue =
dispatch_get_global_queue(0,
0)
try
clientSocket.connectToHost(serveripInput.text!,
onPort: serverPort)
conBtn.backgroundColor =
UIColor.blueColor()
}
catch {
print("error")
conBtn.backgroundColor =
UIColor.redColor()
}
}
func socket(sock:
GCDAsyncSocket!, didConnectToHost host: String!, port:
UInt16) {
print("與伺服器連接成功!")
clientSocket.readDataWithTimeout(-1, tag:
0)
}
func socketDidDisconnect(sock:
GCDAsyncSocket!, withError err: NSError!) {
print("與伺服器斷開連接")
}
func socket(sock:
GCDAsyncSocket!, didReadData data: NSData!, withTag tag:
Int) {
// 1
獲取客戶的發來的數據 ,把 NSData
轉 NSString
let readClientDataString:
NSString? = NSString(data: data, encoding:
NSUTF8StringEncoding)
print(readClientDataString!)
// 2
主界面ui 顯示數據
dispatch_async(mainQueue, {
let showStr:
NSMutableString = NSMutableString()
showStr.appendString(self.msgView.text)
showStr.appendString(readClientDataString!
as String)
showStr.appendString("\n")
self.msgView.text = showStr
as String
})
// 3.處理請求,返回數據給客戶端 ok
let serviceStr:
NSMutableString = NSMutableString()
serviceStr.appendString("ok\n")
clientSocket.writeData(serviceStr.dataUsingEncoding(NSUTF8StringEncoding), withTimeout: -1,
tag: 0)
// 4
每次讀完數據後,都要調用一次監聽數據的方法
clientSocket.readDataWithTimeout(-1, tag:
0)
}
//發送消息按鈕事件
@IBAction func sendBtnClick(sender:
AnyObject) {
// 1.處理請求,返回數據給客戶端 ok
let serviceStr:
NSMutableString = NSMutableString()
serviceStr.appendString(self.msgInput.text!)
serviceStr.appendString("\n")
clientSocket.writeData(serviceStr.dataUsingEncoding(NSUTF8StringEncoding), withTimeout: -1,
tag: 0)
}
}
J. swift語言開發用什麼軟體
自從蘋果wwdc2014大會上推出swift語言之後,程序猿們就開始轉戰開發蘋果軟體;但是swift語言開發編程環境怎麼搭建呢?swift語言開發編程環境搭建教程:1、蘋果電腦一台。2、系統必須是10.9.3以上的。3、下載xcode 6.0 beta版本。xcode6.0beta安裝搞定之後,打開xcode,選擇新建一個」playgroud」,隨便命名一下項目名稱,寫如上代碼運行即可。
