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,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
随机推荐
- [POI2006]SZK-Schools
[POI2006]SZK-Schools luogu #include<bits/stdc++.h> using namespace std; const int N=405,M=1e5+ ...
- SE16传输配置表数据
SE16标准工具传输配置表数据 (上面说了配置表,所以并不是所有的表都能SE16传输.) 了解到: 1.如果是可维护的表,SE16,执行 然后:表条目->传输条目.选择请求: 2.对于不可维护的 ...
- angularjs 中的iframe 标签 ng-src 路径 z-index 必须有position
如果直接写路径到iframe标签里的ng-src中会出现报错: 解决方法: 1.ng里面有个属性是专门用来解决跨域问题的 $sce. 用法: $scope.someUrl = $sce.trustAs ...
- c的详细学习(9)结构体与共用体的学习(一)
C语言提供了另外两种构造类型:结构体与公用体,用来存储若干个类型不同但彼此组成一个集合的数据总体. (1)结构体类型与结构体变量 1.定义 其一般形式为: struct 结构体类型名{ 数据类型1 ...
- 【Flask模板】宏的概念和基本使用
# 宏:模板中的宏跟python中的函数类似,可以传递参数,但是不能有返回值,可以将一些经常用到的代码片段放到宏中,然后把一些不固定的值抽取出来当成一个变量.使用宏的时候,参数可以为默认值.相关示例代 ...
- jQuery悬浮焦点图宽屏
在线演示 本地下载
- 第六篇 javascript面向对象
一.闭包 闭包是指可以包含自由(未绑定到特定对象)变量的代码块. 「闭包」,是指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 闭包是个函数,而它「记 ...
- SDUT 1048 Digital Roots
Digital Roots Time Limit: 1000ms Memory limit: 65536K 题目描述 The digital root of a positive integer ...
- php执行外部命令函数:exec()、passthru()、system()、shell_exec()对比
PHP提供了4种方法执行系统外部命令:exec().passthru().system().shell_exec(),下面分别介绍: 1.exec 原型:string exec ( string $c ...
- Delpih - Format
Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供大家查询之用: 首先看它的声明:function Format(const Format: ...