程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Swift應用Cocoa中的數據類型教程

Swift應用Cocoa中的數據類型教程

編輯:更多關於編程

Swift應用Cocoa中的數據類型教程。本站提示廣大學習愛好者:(Swift應用Cocoa中的數據類型教程)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift應用Cocoa中的數據類型教程正文


作為對 Objective-C 互用性(互操作性)的一部門,Swift供給快捷高效的方法來處置Cocoa數據類型。

Swift 會主動將一些 Objective-C 類型轉換為 Swift 類型,和將 Swift 類型轉換為 Objective-C 類型。在 Objective-C 和 Swift 中也有一些具有互用性的數據類型。那些可轉換的數據類型或許具有互用性的數據類型被稱為bridged數據類型。舉個例子,在 Swift 中,您可以將一個Array值傳遞給一個請求為NSArray對象的辦法。你也能夠轉換一個 bridged 類型和它的正本。當你應用as轉換 bridged 類型或許那些由常量和變量所供給的類型時,Swift 會橋接它們的數據類型。

Swift 也供給一種簡略便捷的籠罩辦法來銜接 Foundation 的數據類型,在前面的 Swift 說話中,你能在它的句法中感觸感染到天然和同一。

字符串

Swift會在String類型和NSString類型中主動轉換。這意味著在可使用NSString對象的處所,您可使用一個屬於 Swift 的String類型取代它,如許做會同時具有它們數據類型的特色,String類型的插值,基於Swift設計的APIs和NSString類更廣的實用規模。是以,您簡直不用再在你的代碼中應用NSString類。現實上,當 Swift 接入 Objective-C APIs 時,它將把一切NSString類型調換為String類型。當您在您的Objective-C代碼中應用 Swift 類時,接入的API會將一切String類型調換成NSString類型。

為了許可字符串轉換,只需接入Foundation。舉個例子,您在 Swift 的一個字符串中挪用了capitalizedString--一個NSString類的辦法,爾後 Swift 會主動將String轉換為一個NSString對象並挪用辦法。這個辦法乃至會前往一個 Swift 的String類型,由於它在接入的時刻被調換了。

import Foundation
let greeting = "hello, world!"
let capitalizedGreeting = greeting.capitalizedString
// capitalizedGreeting: String = Hello, World!

假如您確切須要用到一個NSString對象,您可以用一個 Swift 的String值並轉換它。String類型老是可以從一個NSString對象轉換為一個Swift的String的值,是以,再沒有需要去應用一個可選的類型轉換器()as?)。您也能夠再一個字符串中經由過程界說常量和變量來創立一個NSString對象。

import Foundation
let myString: NSString = "123"
if let integerValue = (myString as String).toInt()){
    println("\(myString) is the integer \(integerValue)")
}

當地化

在Objective-C中,經常使用NSLocalizedString類的宏來定位一個字符串。這聚集的宏包含NSLocalizedStringFromTableInBundle和NSLocalizedStringWithDefaultValue。而在Swift中,只用一個函數便可以完成跟全部NSLocalizedString集一樣的功效,即NSLocalizedString(key:tableName:bundle:value:comment:)。這個NSLocalizedString函數分離為tableName,bundle和value參數供給了一個默許值。你可以用它來調換宏。

數字

Swift會主動將已肯定的數字類型Int和Float轉換為NSNumber。如許的轉換許可你基於個中一品種型創立一個NSNumber:

let n = 42
let m: NSNumber = n

你也能傳遞一個Int類型的值,好比傳遞給一個請求為NSNumber類型的參數。同時須要留意的是,NSNumber可以包括多種分歧的類型,是以您不克不及把它傳遞給單一的一個Int值。

上面所列出的類型都邑主動轉換為NSNumber:
Int
UInt
Float
Double
Bool

類聚集

Swift 會主動將NSArray和NSDictionary類轉換為Swift裡等價的類。這意味著你將受害於Swift壯大的算法和得天獨厚的語法來處置聚集--可相互轉換的 Foundation 和 Swift 聚集類型。

數組

Swift 會在Array類型和NSArray類型中主動轉換。當你從一個 Swift 數組轉換到一個NSArray對象,轉換後的數組是一個AnyObject[]類型的數組。假如某個對象是 Objective-C 或許 Swift 類的實例,或許這個對象可以轉換成另外一品種型,那末這個對象則屬於AnyObject類型的對象。你可以將任一NSArray對象轉換成一個 Swift 數組,由於一切 Objective-C 的對象都是AnyObject類型的。正因如斯,Swift 的編譯器會在接入 Objective-C APIs 的時刻將NSArray類調換成AnyObject[]。

當你將一個NSArray對象轉換成一個 Swift 數組後,你也能夠將數組強迫類型轉換成一個特定的類型。與從NSArray類轉換到AnyObject[]分歧的是,從AnyObject類型的對象轉換成明白的類型其實不會包管勝利。因為直到運轉時編譯器才曉得AnyObject的對象可否被強迫轉換為特定的類型,是以,從AnyObject[]轉換為SomeType[]會前往一個optional的值。舉個例子,假如你曉得一個Swift數組只包括UIView類的實例(或許一個UIView類的子類),你可以將AnyObject類型的數組元素強迫轉換為UIView對象。假如Swift數組中得元素在運轉時不是UIView類型的對象,那末轉換則會前往nil。


let swiftyArray = foundationArray as AnyObject[]
if let downcastedSwiftArray = swiftArray as? UIView[] {
    // downcastedSwiftArray contains only UIView objects
}

你也能夠在for輪回中將NSArray對象定向地強迫轉換為特定類型的Swift數組:


for aView: UIView! in foundationArray {
     // aView is of type UIView
}

留意:這類轉換是強迫轉換,假如轉換不勝利則會在運轉時發生毛病信息。

當你從 Swift 數組轉換為NSArray對象時,Swift 數組裡的元素必需是屬於AnyObject的。例如,一個Int[]類型的 Swift 數組包括Int構造的元素。Int類型其實不是一個類的實例,但因為Int類型轉換成了NSNumber類,Int類型屬於AnyObject類型的。是以,你可以將一個Int[]類型的Swift數組轉換為NSArray對象。假如 Swift 數組裡的一個元素不屬於AnyObject類型,那末在運轉時就會發生毛病。

你也能夠從 Swift 數組中創立一個NSArray對象。當你將一個常量或變量界說為一個NSArray對象並分派一個數組給它作為實例變量時,Swift 將會創立 NSArray對象,而不是 Swift 數組。

let schoolSupplies: NSArray = ["Pencil", "Eraser", "Notebkko"]
// schoolSupplies is an NSArray object containing NSString objects

下面的例子中,Swift 數組包括包括三個String字符串。因為從String類型轉換為NSString類,數組字面量被轉換成一個NSArray對象,並勝利分派給schoolSupplies變量。

當您在 Objective-C 代碼中應用 Swift 類或許協定時,接入的API會將全體一切類型的Swift數組取代為NSArray。若您將一個NSArray對象傳遞給Swift的API並請求數組元素為一個新的類型,運轉時就會發生毛病。假如 Swift API 前往一個不克不及被轉換為NSArray類型的 Swift 數組,毛病也會隨之發生。

Foundation數據類型

Swift 也供給一種簡略便捷的籠罩辦法來銜接界說在 Foundation 框架中的數據類型。在NSSize和NSPoint中應用籠罩辦法,在剩下的 Swift 說話中,你能在它的句法中感觸感染到天然和同一。好比,你可使用以下語法創立一個NSSize類型的構造:

let size = NSSize(width: 20, height: 40)

籠罩辦法也許可你以一種天然的方法挪用 Foundation 的構造函數。

let rect = NSRect(x: 50, y: 50, width: 100, height: 100)
let width = rect.width // equivalent of NSWidth(rect)
let maxX = rect.maxY // equivalent of NSMaxY(rect)

Swift可以將NSUInteger和NSInteger轉換為Int類型。這些類型都邑在 Foundation APIs 中變成Int類型。在 Swift 中Int常被盡量地用以連接性,同時當你請求一個無符號整數類型時,UInt類型老是可以使用的。

Foundation函數

在 Swift 中,NSLog可在體系掌握台輸入信息。您可以像在 Objective-C 中應用過的語法格局那樣應用此函數。


NSLog("%.7f", pi)  // Logs "3.1415927" to the console

同時,Swift 也供給像print和println那樣的輸入函數。多歸於 Swift 的字符插值機制才讓這些函數簡略,粗魯,多效。這些函數不會在體系掌握台輸入信息,但在須要挪用的時刻倒是可用的。

Swift 中不再存在NSAssert函數,取而代之的是assert函數。

Core Foundation

Swift中的 Core Foundation 類型是一個成熟的類。當湧現內存治理正文時,Swift 會主動地治理 Core Foundation 對象的內存,這個中包含你實例化了的 Core Foundation 對象。在 Swift 中,你可以自在變換 Fundation 和 Core Foundation 類型。假如你想先轉換為橋接 Foundation 類型時,你也能夠橋接一些 toll-free bridged Core Foundation 類型到 Swift 尺度庫類型。

重界說類型

當 Swift 導入 Core Foundation 類型時,編譯器會重映照導入的類型名字。編譯器會從每一個類型名字的末尾移除Ref,這是由於一切的 Swift 類都屬於援用類型,是以後綴是過剩的。

Core Foundation 中的CFTypeRef類型會對Anyobject類型重映照。所以你之前應用的CFTypeRef,如今該換成AnyObject了。

內存治理對象

在 Swift 中,從 annotated APIs 前往的 Core Foundation 對象可以或許主動停止內存治理--你不再須要挪用本身的CFRetain,CFRelease,或許CFAutorelease函數。假如你從本身的C函數和 Objective-C 辦法中前往一個 Core Foundation 對象,你須要用CF_RETURNS_RETAINED或許CF_RETURNS_NOT_RETAINED正文這個對象。當 Swift 代碼中包括這些 APIs 時,編譯器會在編譯時主動挪用內存治理。假如你只挪用那些不會直接前往 Core Foundation 對象的 annotated APIs,那末如今你可以跳過本節的殘剩部門了。不然,上面我們持續進修非托管的 Core Foundation 對象。

非托管對象

當 Swift 導入 unannotated 的APIs時,編譯器將不會主動地對前往的 Core Foundation 對象停止內存治理托管。Swift 將這些前往的 Core Foundation 對象關閉在一個Unmanaged<T>構造中。那些直接前往 Core Foundation 的對象也長短托管的。舉個例子,這裡有一個 unannotated 的 C 函數:

CFStringRef StringByAddingTwoStrings(CFStringRef string1, CFStringRef string2)

這裡解釋了Swift是怎樣導入的:

func StringByAddingTwoStrings(CFString!, CFString!) -> Unmanaged<CFString>!

假定您從 unannotated APIs 吸收了非托管的對象,在應用它之前,你必需將它轉換為可以或許內存治理的對象。在這方面,Swift 可以幫你停止內存治理而不消本身著手。同時,Unmanaged<T>構造也供給了兩個辦法來把一個非托管對象轉換為一個可內存治理的對象--takeUnretainedValue()辦法和takeRetainedValue()辦法。這兩個辦法會前往原始的,非關閉的對象類型。您可以依據您現實挪用的APIs前往的unretained或retained的對象,來選擇哪一辦法更適合。

好比,假定這裡有一個 C 函數,這個函數在前往值前不會釋放CFString對象。在應用這個對象前,您應用takeUnretainedValue()函數,以將它轉換為一個可以或許內存治理托管的對象。


let memoryManagedResult = StringByAddingTwoStrings(str1, str2).takeUnretainedValue()
// memoryManagedResult is a memory managed CFString

您也能夠在一個非托管的對象中應用retain(),release()和autorelease()辦法,然則這類做法其實不值得推舉。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved