Swift中的参数内部名称和外部名称
1.什么是参数的内部名称和外部名称?
struct Color {
let red, green, blue: Double
init(red redColor: Double,green greenColor: Double,blue blueColor: Double) {
red = redColor
green = greenColor
blue = blueColor
}
}
1.1 Color这个结构体的构造方法中提供了三个参数,其中red是第一个参数的外部名称,redColor是第一个参数的内部名称;同理green和blue分别是第二、三个参数的外部名称,greenColor和blueColor分别是第二、三个参数的内部名称。外部名称在创建实例时的提示中显示,内部名称只能在构造方法内部使用,两个名称指的是同一个参数。在创建实例时会显示外部名称截图:

1.2 如果只有参数的内部名称,没有外部名称,编译器会自动为参数创建一个和内部名称相同的外部名称。看实例:

这个只有一个参数的构造函数的外部参数名称和内部参数名称相同。
1.3 内部参数名称可以用来区分是传入的参数还是实例的属性,也可以用self来区分
struct Color {
let red, green, blue: Double
init(RED redColor: Double,GREEN greenColor: Double,BLUE blueColor: Double) {
red = redColor
green = greenColor
blue = blueColor
}
init(white: Double) {
red = white
green = white
blue = white
}
init(red: Double,green: Double,blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
}
1.4 编译器根据外部参数名称去检查构造器是重载还是重名的。
1.5 如果不希望提供参数的外部名称,可以用_显示代替参数的外部名称,创建实例的时候,编译器会显示参数的内部名称。
struct Color {
let red, green, blue: Double
init(red redColor: Double,green greenColor: Double,blue blueColor: Double) {
red = redColor
green = greenColor
blue = blueColor
}
init(white: Double) {
red = white
green = white
blue = white
}
init(_ red1: Double,_ green1: Double,_ blue1: Double) {
self.red = red1
self.green = green1
self.blue = blue1
}
}

2.类的构造器和结构体构造器的区别
实体类的构造器,定义普通类型的属性时,必须初始化(声明时就初始化或者在构造函数中初始化),如果不初始化会报错。可选类型的属性可以不初始化,因为可选类型不初始化的时候,默认值时nil。
结构体的构造器,普通类型和可选类型的属性均可不初始化,编译器会默认提供一个带全参的构造器,这个构造器实体类是没有的。如果结构体中有普通类型的属性未初始化,则编译器不会提供结构体名称+括号的默认构造器,只会提供一个带全参的构造器,这样避免创造一个未初始化过的结构体。
实体类构造器:
class ShoppingListItem {
var name: String?
var quantity: String?
var purchased: String?
}
以上构造器默认全部初始化为nil,所以编译器会默认提供一个ShoppingListItem()的构造器,也可以在类中添加其他构造器从而让编译器提供其他的构造器。默认构造器截图:

结构体构造器:
a.结构体声明中有未初始化的属性
struct Car {
var name: String?
var quantity: Int
var purchased: String?
}
编译器默认只提供全参的构造器:

b.结构体声明中没有未初始化的属性
struct Car {
var name: String?
var quantity: String?
var purchased: String?
}
编译器会提供2个默认的构造器:

3.类的指定构造器和便利构造器(构造器中属性前有没有self.结果都是一样,属性名前面默认会自带self.)
3.1 指定构造器的作用就是为了初始化属性值,便利构造器需要添加关键字convenience,并且便利构造器无法直接访问属性,必须通过指定构造器间接访问
class Food {
var name: String
//指定构造器
init(name: String) {
self.name = name
}
//便利构造器
convenience init() {
self.init(name: "[Unnamed]")
//name = "CCC" //会报错
}
}
Swift中的参数内部名称和外部名称的更多相关文章
- Bash 中同名的内部命令和外部命令
昨天有个人在 bug-bash 上问:为什么 [ --help 没有输出帮助信息.有人回答他了,原因是 coreutils 提供的 [ 命令才接受 --help 选项,Bash 自己的 [ 命令不接受 ...
- swift中_的用法,忽略默认参数名。
swift中默认参数名除了第一个之外,其他的默认是不忽略的,但是如果在参数的名字前面加上_,就可以忽略这个参数名了,虽然有些麻烦,但是这种定义也挺好,而且不想知道名字或者不想让别人知道名字的或者不用让 ...
- 在Swift中应用Grand Central Dispatch(上)转载自的goldenfiredo001的博客
尽管Grand Central Dispatch(GCD)已经存在一段时间了,但并非每个人都知道怎么使用它.这是情有可原的,因为并发很棘手,而且GCD本身基于C的API在 Swift世界中很刺眼. 在 ...
- android中的文件操作详解以及内部存储和外部存储(转载)
原文链接:http://m.blog.csdn.net/article/details?id=17725989 摘要 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安 ...
- 【转】 android中的文件操作详解以及内部存储和外部存储
摘要 其实安卓文件的操作和Java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者 ...
- 彻底了解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- 彻底理解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- 【转】彻底理解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
随机推荐
- Mybatis中的关联映射和查询
一.商品订单数据模型 1.数据表 这里定义了四个表,分别表示用户,商品,订单,和订单详情. 用户表user CREATE TABLE `user` ( `id` int(11) NOT NULL AU ...
- 大数据学习系列(6)-- zookeeper集群搭建
下载 wget http://mirrors.shuosc.org/apache/zookeeper/zookeeper-3.3.6/zookeeper-3.3.6.tar.gz tar -zxvf ...
- <%%>与<scriptrunat=server>,<%=%>与<%#%>的区别(转)
这些东西都是asp.net前台页面与后台代码交互过程中经常使用的,它们之间有的非常相似,又有一些不同.对比学习下,看看他们之间的联系与区别. 首先看<%%>与<scriptrunat ...
- 九度OJ 1203:IP地址 (字符串处理)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3038 解决:1496 题目描述: 输入一个ip地址串,判断是否合法. 输入: 输入的第一行包括一个整数n(1<=n<=500) ...
- 阿里云+LAMP环境配置
1. 准备好一键Linux环境的脚本: http://dwz.cn/6Nlexm 2. 运行命令:# yum install lynx tree nmap sysstat lrzsz dos2unix ...
- 【python】-- RabbitMQ RPC模型
RabbitMQ RPC模型 RPC(remote procedure call)模型说通俗一点就是客户端发一个请求给远程服务端,让它去执行,然后服务端端再把执行的结果再返回给客户端. 1.服务端 i ...
- JavaScript-Confirm用法
function checkMobileBind() { if(confirm('您尚未绑定手机,是否前往绑定?')) { window.location='http://m ...
- [luogu3601]签到题
[luogu3601]签到题 luogu 求\[\sum_{i=l}^ri-\phi(i)\] 一个朴素的想法是枚举l~r,根号求\(\phi\),显然这样是\((r-l)\sqrt r\),时间无法 ...
- ABAP面试经历【转http://blog.csdn.net/tsj19881202/article/details/8792742】
本周三面试了一次HP的globe部门,整个过程自己感觉特别糟糕.总结了一下经验, 1.不能把自己平时做的东西,很好的用语言描述出来 2.技术点其实都会,但是不了解对方问题的意思,所以没能很好的回答对方 ...
- Spring注解式与配置文件式
http://tom-seed.iteye.com/blog/1584632 Spring注解方式bean容器管理 1.通过在配置文件中配置spring组件注入 <context:compone ...