建立我的第一个iOS游戏

两个星期前的星期天晚上,我无事可做。 因此,我开始谷歌搜索一些iOS教程,并登陆了Ray Wenderlich制作的这本令人惊叹的视频教程。 对于像我这样的初学者来说,这非常令人兴奋且易于遵循。 我之前曾研究过Swift文档,但很容易感到无聊。 😝

在该教程中,您将通过构建一些名为Bull’s Eye的简单游戏来学习iOS开发的基础。 它会生成一个介于1到100之间的随机数。然后,它会向用户提出挑战,要求估算滑块并将其尽可能靠近该随机数。 距离越近,分数越高。 很简单

您可以在我的Github存储库中检出完整的项目:risan / bullseye-ios。

基本数据类型

Swift提供了几种基本数据类型,以下是我到目前为止使用的一些类型:

  • Int :对于正数或负数(例如-12-12 );
  • Float :十进制数字(例如3.14-0.123 );
  • Double :双精度浮点数-比Float精确得多;
  • 布尔值:布尔值( truefalse );
  • Character :对于单个字符(例如Ab& ); 和
  • String :字符的集合(例如Hello World )。

使用整数

Swift还提供了其他几种用于处理整数的数据类型:

  • UInt Int的无符号版本(仅零和正数)
  • Int8UInt8位版本;
  • Int16UInt16 — 16位版本;
  • Int32UInt32位版本; 和
  • Int64UInt64位版本。

除非您知道自己在做什么,否则在处理整数时始终使用Int数据类型。

使用十进制

还有其他几种用于处理十进制数字的数据类型:

  • Float32 —浮点类型的32位版本;
  • Float64位版本; 和
  • Float80扩展的精度浮点类型。

但是,Swift文档建议我们在处理十进制数字时始终使用Double数据类型。

声明变量

使用var关键字声明一个变量:

  var名称:String =“ John Doe” 
变量年龄:整数= 23
var分值:双倍= 75.34
var isAwesome:Bool = true
var等级:字符=“ A”

由于它是一个变量,因此我们可以更改它的值,只要它具有相同的数据类型即可。

  var名称:String =“ John Doe” 

name =“ Foo Bar”

//将抛出错误,因为它是整数而不是字符串。
名称= 12

//我们必须显式转换新值
//转换为相同的数据类型。
名称=字符串(12)

声明一个常量

要声明一个常量,我们使用let关键字:

 设最大值:整数= 100 
令pi:Double = 3.14

//引发错误,因为我们不允许更改该值。
pi = 3.1423

类型推断

Swift是一种强类型语言。 但是,它允许我们声明变量或常量,甚至不指定其数据类型。 Swift足够聪明,可以根据其初始值确定数据类型。

  var totalItems = 5 //整数 
var totalAmounts = 50.3 // Double
let message =“成功!” //字串
let isPaid = true //布尔
let grade =“ A” //字符串

请注意,默认情况下,十进制数将被推断为Double而不是Float 。 即使该值也可能适合另一个数据类型(如UInt8 ,也会将一个舍入数也推断为Int

在Swift中,我们可以将变量或常量的值放在字符串中,如下所示:

  “某些字符串\(yourVariableOrConstant)” 

当我们在字符串中外推变量或常量时,我​​们不需要显式转换数据类型-即使它不是字符串。

 让totalItems = 5 
让totalAmounts = 50.3
让isPaid = true
let message =“成功!”

print(“总项目:\(totalItems)\ n总金额:$ \(totalAmounts)”)
打印(“已付款:\(isPaid)\ n消息:\(消息)”)

上面的代码将输出以下输出:

 共有5件 
总金额:50.3美元
已付款:是
消息:成功!

我们也可以使用三引号( """ )来构造多行字符串,以下代码将具有与上述相同的输出:

 打印(””” 
总项目数:\(totalItems)
总金额:$ \(总金额)
已付款:\(isPaid)
讯息:\(讯息)
“”“)

使用func关键字创建一个函数:

  func sayHello(){ 
打印(“ Hello World!”)
}

//调用函数。
问好()

带参数的功能

我们还可以使用参数创建函数:

  func greet(name:String){ 
打印(“ Hello \(name)!”)
} //您好,数据先生!
问候(姓名:“数据先生”)//你好,达斯·维达!
greet(name:“ Darth Vader”)//抛出错误,因为我们传递了一个double
问候(名称:123.45)

请注意,当我们调用上面的greet函数时,我们也如何传递name 。 在Swift中,该name也称为“参数标签”。

我们可以根据需要设置任意数量的参数:

  func Introduction(名称:字符串,年龄:整数){ 
print(“嗨,我叫\(名字),我今年\(年龄)岁。”)
}

Introduction(姓名:“ John”,年龄:23​​岁)

//由于我们无法更改参数的顺序,将引发错误。
简介(年龄:19岁,姓名:“卢克”)

请注意,即使参数已被标记,我们也无法更改这些参数的顺序。

在函数中省略参数标签

我们可以配置该函数,以便在调用它时不必指定参数标签。 要省略参数标签,只需在参数名称前加下划线( _ ):

  func greet(_名称:字符串){ 
打印(“嗨,(名字)!”)
}

greet(“ Captain Kirk”)//嗨,柯克船长!

//将抛出错误,我们必须省略参数标签。
问候(名字:“约翰”)

我们可以将命名参数与省略的参数组合:

  func Introduction(_名称:字符串,年龄:整数){ 
print(“嗨,我叫\(名字),我今年\(年龄)岁。”)
} //您好,我叫John,今年23岁。
Introduction(“ John”,年龄:23​​)

当然,我们也可以有多个参数而没有任何参数标签:

  func Introduction(_名称:字符串,_年龄:整数){ 
print(“嗨,我叫\(名字),我今年\(年龄)岁。”)
} //您好,我叫Jar Jar,今年33岁。
简介(“ Jar Jar”,33)

重命名功能参数

在Swift中,我们可以在参数名称和参数标签之间使用不同的标识符。

  func welcome(to name:String){ 
print(“欢迎使用\(name)!”)
}

welcome(to:“ Jungle”)//欢迎来到丛林!

调用welcome函数时, to将用作参数标签。 该name将用作函数体内参数的标识符。

具有返回值的功能

到目前为止,我们只创建了没有返回值的函数。 要创建具有返回值的函数,只需使用return关键字并在右花括号前声明返回类型:

  func sum(_ a:Int,_ b:Int)-> Int { 
返回a + b
}

sum(10,20)// 30
sum(10,-20)// -10

多年前,当我第一次尝试Swift时,“可选”是我一直在努力的概念之一。 现在我终于明白了。 它只是一种接受nil作为值的数据类型-这意味着没有值。 我们使用问号( ? )表示可选类型:

  var名称:字符串?  //可选的字符串类型 
var message:String =“ John” //仅是常规String类型

name =“ John” //我们可以分配一个常规的String值
name = nil //或者我们也可以指定一个`nil`

//但是这会引发错误,因为message不是可选类型。
消息=零

可选装订

我们可以将可选类型视为一个盒子。 它可以包含某些内容(某个值),也可以完全不包含任何内容( nil值)。 为了知道这个盒子里面有什么,我们必须打开它。 在Swift中,此过程称为“展开”,就像展开礼物盒一样!

“解包”可选类型的一种方法是使用可选绑定。 我们使用let关键字将可选类型分配给某些常量; 然后,我们使用if语句包装此分配,如下所示:

  var名称:字符串? 

如果让unwrappedName =名称{
//如果name不为nil,将执行此块
打印(“嗨\(unwrappedName)!”)
}其他{
//如果名称为nil,则将执行此块
打印(“名称为空”)
}

使用class关键字定义一个类:

 类人{ 
让isHuman = true
var name =“ John Doe”

func sayHi(){
打印(“嗨,我叫\(名字)!”)
}
}

让john = Person()

john.isHuman //是
john.name // John Doe
john.sayHi()//嗨,我叫John Doe!

john.name =“ Yoda”
john.sayHi()//嗨,我叫Yoda!

//因为isHuman是一个常量,将引发错误。
john.isHuman =假

就像调用函数一样,我们使用Person()来初始化Person类的新对象。 然后,我们可以使用点( . )来访问对象的属性和方法。

类初始化器

该类还可以具有初始化程序或构造函数。 这是我们设置类实例的好地方; 例如为属性分配一些初始值:

 类人{ 
变量名称:字符串
变量年龄:整数?

//类的初始值设定项
init(name:String,age:Int?){
self.name =名称
自我年龄=年龄
}

func sayHi(){
var message =“嗨,我叫\(名字)”

如果让ageValue = age {
消息+ =“我今年\(ageValue)岁”
}

打印(留言)
}
}

let anakin =人员(名称:“ Anakin”,年龄:20)
let luke = Person(姓名:“ Luke”,年龄:无)

anakin.sayHi()//嗨,我叫Anakin,今年20岁
luke.sayHi()//嗨,我叫卢克

请注意,当方法中的参数与类的属性之一具有相同的名称时,我们可以使用self关键字来引用类的属性。

在Swift中,我们可以声明具有相同名称的函数或方法,只要它具有不同的参数签名即可。 类初始化程序也是如此,我们可以有几个具有不同参数签名的init()

 类人{ 
变量名称:字符串
变量年龄:整数?

// age参数现在不是可选的。
init(name:String,age:Int){
self.name =名称
自我年龄=年龄
}

//另一个init但没有age参数。
init(name:String){
self.name =名称
}

func sayHi(){
var message =“嗨,我叫\(名字)”

如果让ageValue = age {
消息+ =“我今年\(ageValue)岁”
}

打印(留言)
}
}

let anakin =人员(名称:“ Anakin”,年龄:20)
let luke =人员(名称:“ Luke”)

anakin.sayHi()//嗨,我叫Anakin,今年20岁
luke.sayHi()//嗨,我叫卢克

这是我在整个教程中发现的其他一些发现:

  • 除非要在一行中包含多个语句,否则无需在每个语句的末尾使用分号( ; )。
  • 从库放到情节提要中的每个UI对象都是某个类的对象。
  • 如果我们希望它引用情节@IBOutlet上的某个对象,请在类的属性上使用@IBOutlet关键字。
  • 如果希望在@IBAction上某个对象上发生特定事件时执行该方法,请在类的方法上使用@IBAction关键字。

强制展开

  @IBOutlet弱var滑块:UISlider! 

上面代码结尾的感叹号( ! )用于强制展开可选类型。 这意味着如果slider nil则代码执行将被中止。

类继承

 类ViewController:UIViewController { 

覆盖func viewDidLoad(){
super.viewDidLoad()
}
}

在上面的代码中,我们声明了一个名为ViewController的类,该类继承自UIViewController类。 在Swift中,我们可以覆盖父方法。 为此,我们必须在新方法声明之前使用override关键字。 我们还可以使用super关键字来访问parent的原始方法或属性。

已知类型参数

下面是UISlider类的setThumbImage方法的签名:

  func setThumbImage(_ image:UIImage ?,用于状态:UIControl.State) 

假设我们有一个名为slider的变量,它是UISlider类的一个实例。 我们可以这样调用上面的方法:

  slide.setThumbImage(someUIImageInstance,用于:UIControl.State.normal) 

UIControl.State是一个结构,其中包含几个描述控件状态的常量。 并且因为for参数的类型已知为UIControl.State ,所以我们实际上可以只使用点( . )来访问结构的常量:

  slide.setThumbImage(someUIImageInstance,用于:.normal) 

使用闭包

  UIAlertAction(title:“ OK”,style:.default,handler:{ 
行动
self.startNewRound()
})

上面的代码取自教程的源代码。 我们将闭包声明为handler参数的参数。 in关键字用于将闭包的参数与主体分开。 在上面的代码中,我们只有一个参数: UIAlertAction这是新创建的UIAlertAction类的实例。

在WebView上显示本地HTML文件

这是我们用来在WebKit WebView中显示本地保存的HTML文件的代码:

  //加载名为“ about.html”的本地HTML文件 
如果让htmlPath = Bundle.main.path(forResource:“ about”,ofType:“ html”){
让htmlUrl = URL(fileURLWithPath:htmlPath)
让htmlUrlRequest = URLRequest(url:htmlUrl)
webView.load(htmlUrlRequest)
}

请注意,上面的webView标识符引用情节WKWebView上的WKWebView对象。

我必须说,到目前为止,我喜欢使用Swift创建iOS应用程序。 Swift语法比其前身(目标C)更简洁明了。对我来说,它也更容易理解。

我的这个小小的探索,使我找到了更多有关使用Swift构建iOS开发的教程。 到目前为止,我还完成了另外4个教程:

1.自动布局练习

2.堆栈视图实践

3.创建分页的滑动卡

4.战争纸牌游戏

我可能应该开始阅读Swift文档。 🤔


最初于 2018 年10月10日 发布在 bagja.net