建立我的第一个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
精确得多; - 布尔值:布尔值(
true
或false
); -
Character
:对于单个字符(例如A
,b
或&
); 和 -
String
:字符的集合(例如Hello World
)。
使用整数
Swift还提供了其他几种用于处理整数的数据类型:
-
UInt
Int
的无符号版本(仅零和正数) -
Int8
和UInt8
位版本; -
Int16
和UInt16
— 16位版本; -
Int32
和UInt32
位版本; 和 -
Int64
和UInt64
位版本。
除非您知道自己在做什么,否则在处理整数时始终使用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 。