我正在尝试使用 swift SQLClient.h 访问 SQL Server 已经在使用类 我访问类,但我无法将 objective-c 代码转换为 swift。原始代码是这样的:
SQLClient* client = [SQLClient sharedInstance];
client.delegate = self;
[client connect:@"server:port" username:@"user" password:@"pass" database:@"db" completion:^(BOOL success) {
if (success)
{
[client execute:@"SELECT * FROM Users" completion:^(NSArray* results) {
for (NSArray* table in results)
for (NSDictionary* row in table)
for (NSString* column in row)
NSLog(@"%@=%@", column, row[column]);
[client disconnect];
}];
}
}];
谁能做出一个快速?.我做不到。我在完成时遇到错误
我得到了这个:
var client = SQLClient((
client.delegate = self
client.connect("172.29.XX.XX:1433", username: "XX", password: "XXXX", database: "XXX", completion: {(success:Bool) -> Void in
if success
{
client.execute("SELECT * FROM Users" , completion: {(results:NSArray) -> Void in
for (table:NSArray in results)
for (row:NSDictionary in table)
for (column:NSString in row)
NSLog(@"%@=%@", column, row[column])
client.disconnect
} )
}
})
谢谢
几个观察结果:
-
在你的 Objective-C 代码示例中,你使用的是单例,所以我假设你也应该在 Swift 代码中这样做:
let client = SQLClient.sharedInstance()
您也可以使用
let
代替var
。始终支持不变性而不是可变性。仅在您需要可变的地方使其可变。 -
您的
for
循环:-
需要牙套
-
不过,不需要
for
循环表达式周围的括号 -
Swift 中字典的
for
循环返回一个包含键和值的元组(在 Objective-C 中它只是键(
-
-
当你调用
disconnect
时,这是一个函数,所以我会包含()
。 -
如果需要,您可以使用
NSLog
,但在 Swift 中我们经常使用println
.printf
但是,我们通常使用字符串插值(例如"value = (variable)"
variable
的值将插入该字符串的位置。 -
作为一个次要的观察,我倾向于采用尾随闭包语法(它摆脱了那些
completion
参数,转换为函数之后的闭包(并使用隐含类型来清理代码示例。
放在一起,会产生如下结果:
let client = SQLClient.sharedInstance()
client.delegate = self
client.connect("172.29.XX.XX:1433", username: "XX", password: "XXXX", database: "XXX") {
success in
if success {
client.execute("SELECT * FROM Users") {
results in
for table in results as NSArray {
for row in table as NSArray {
for column in row as NSDictionary {
println("(column.key) = (column.value)")
}
}
}
client.disconnect()
}
}
}
或者,可能是这样的:
let client = SQLClient.sharedInstance()
client.delegate = self
client.connect("172.29.XX.XX:1433", username: "XX", password: "XXXX", database: "XXX") {
success in
if success {
client.execute("SELECT * FROM Users") {
results in
for table in results as [[[String:AnyObject]]] {
for row in table {
for (columnName, value) in row {
println("(columnName) = (value)")
}
}
}
client.disconnect()
}
}
}
class ViewController: UIViewController,SQLClientDelegate
func error(error: String, code: Int32, severity: Int32) {
println(error)
}
sharedInstance()
是一个anyObject
,你必须将client
设置为SQLclient
才能将 de delegate 设置为 self:
let client = SQLClient.sharedInstance() as! SQLClient