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中的参数内部名称和外部名称的更多相关文章

  1. Bash 中同名的内部命令和外部命令

    昨天有个人在 bug-bash 上问:为什么 [ --help 没有输出帮助信息.有人回答他了,原因是 coreutils 提供的 [ 命令才接受 --help 选项,Bash 自己的 [ 命令不接受 ...

  2. swift中_的用法,忽略默认参数名。

    swift中默认参数名除了第一个之外,其他的默认是不忽略的,但是如果在参数的名字前面加上_,就可以忽略这个参数名了,虽然有些麻烦,但是这种定义也挺好,而且不想知道名字或者不想让别人知道名字的或者不用让 ...

  3. 在Swift中应用Grand Central Dispatch(上)转载自的goldenfiredo001的博客

    尽管Grand Central Dispatch(GCD)已经存在一段时间了,但并非每个人都知道怎么使用它.这是情有可原的,因为并发很棘手,而且GCD本身基于C的API在 Swift世界中很刺眼. 在 ...

  4. android中的文件操作详解以及内部存储和外部存储(转载)

    原文链接:http://m.blog.csdn.net/article/details?id=17725989 摘要 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安 ...

  5. 【转】 android中的文件操作详解以及内部存储和外部存储

    摘要 其实安卓文件的操作和Java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者 ...

  6. 彻底了解android中的内部存储与外部存储

    我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...

  7. 彻底理解android中的内部存储与外部存储

    我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...

  8. 【转】彻底理解android中的内部存储与外部存储

    我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...

  9. android中的内部存储与外部存储

    我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...

随机推荐

  1. EasyDSS视频点播服务器实现的多码率点播功能的说明

    EasyDSS流媒体音视频直播与点播服务器软件,是一套提供一站式的转码.点播.直播.检索.回放.录像下载服务的高性能RTMP/HLS/HTTP-FLV流媒体服务,极大地简化了流媒体相关业务的开发和集成 ...

  2. spring配置中的classpath

    1 classpath指WEB-INF下面的classes目录 2 配置成classpath*的话,spring会去所有的classpath中去找,包括lib下面的jar包 对于web app而言,c ...

  3. 【题解】POJ2279 Mr.Young′s Picture Permutations dp

    [题解]POJ2279 Mr.Young′s Picture Permutations dp 钦定从小往大放,然后直接dp. \(dp(t1,t2,t3,t4,t5)\)代表每一行多少人,判断边界就能 ...

  4. Js中的apply和call

    1.call和apply都是为了改变某个函数运行时的上下文而存在的 2.也就是改变函数体内this的指向. 3.二者的作用完全一样,只是接受参数的方式不太一样. 4.call 需要把参数按顺序传递进去 ...

  5. Swift——(四)Swift中"#"的妙用

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/twlkyao/article/details/31350841     在Swift中," ...

  6. win7旗舰版 安装IIS中出现的问题

    最好先安装IIS成功了,再安装VS2010或者别的版本 1.hppt 错误500.19,-Internal server erroe,无法访问的请求野蛮,因为该页的相关配置数据无效,HTTP Erro ...

  7. Android动画效果animation

    1.Tween 根据指定动画开始和结束时的对象属性(位置.Alpha值(透明度).大小.角度等)以及动画播放的时间长度生成动画: 2.Frame 指定每一帧所播放的图片和时间长度.   建立动画的方法 ...

  8. 关于align-items和align-content的区别和使用场景

    最近在研究flex布局,容器中有两个属性,是用来定义crossAxis测轴排列方式的.一开始接触align-items还可以理解感觉不难,后来看到align-content就感觉有点混淆了,特开一篇博 ...

  9. 运行“cordova build android” - 无法找到属性android:fontVariationSettings和android:ttcIndex

    :app:processArm64DebugResourcesC:\Users\xfcao\.gradle\caches\transforms-1\files-1.1\xwalk_core_libra ...

  10. 关于随机浏览头伪装fake-UserAgent

    使用: from fake_useragent import UserAgent ua = UserAgent() #ie浏览器的user agent print(ua.ie) Mozilla/5.0 ...