swift_030(Swift 的访问控制)
//***********swift学习之30--访问控制--***************************
// 1.访问控制可以限定 其他源文件或模块中代码 对你代码的访问级别。
// 2.访问控制基于 模块与源文件。
// a:模块 指的是以独立单元构建和发布的Framework或Application。在Swift 中的一个模块可以使用import关键字引入另外一个模块。
// b:源文件是单个源码文件,它通常属于一个模块,源文件可以包含多个类和函数 的定义。
// Swift 为代码中的实体提供了三种不同的访问级别:public、internal、private。
// A: 函数类型访问权限
// 函数的访问级别需要根据该函数的参数类型和返回类型的访问级别得出。
internal class SomeInternalClass {
}
private class SomePrivateClass {
}
// 下面的例子定义了一个名为someFunction全局函数,并且没有明确地申明其访问级别。
//func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// 函数实现
//}
// 函数中其中一个类 SomeInternalClass 的访问级别是internal,另一个 SomePrivateClass 的访问级别是private。所以根据元组访问级别的原则,该元组的访问级别是private。
// 因为该函数返回类型的访问级别是private,所以你必须使用private修饰符,明确的声明该函数:
private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// 函数实现
let intenalClass = SomeInternalClass()
let privateClass = SomePrivateClass()
return (intenalClass,privateClass)
}
// B: 枚举类型访问权限
// C:子类访问权限
// 子类的访问级别不得高于父类的访问级别。比如说,父类的访问级别是internal,子类的访问级别就不能申明为public。
public class FtheClass {
internal func show() {
print("超类")
}
}
// 访问级别不能低于超类 internal > public
internal class SooClass: FtheClass {
// override internal func show() {
// print("子类")
// }
override internal func show() {
print("子类")
}
}
let sup = FtheClass()
sup.show()
let subb = SooClass()
subb.show()
// D: 协议访问权限
// 如果想为一个协议明确的申明访问级别,那么需要注意一点,就是你要确保该协议只在你申明的访问级别作用域中使用。
// 如果你定义了一个public访问级别的 协议 ,那么实现该协议提供的必要函数也会是public的访问级别。这一点不同于其他类型,比如,public访问级别的其他类型,他们成员的访问级别为internal。
public protocol TcpppProtocol {
init(no1: Int)
}
public class MainnnClass {
var no1: Int // local storage
init(no1: Int) {
self.no1 = no1 // initialization
}
}
class SubbbClass: MainnnClass, TcpppProtocol {
var no2: Int
init(no1: Int, no2 : Int) {
self.no2 = no2
super.init(no1:no1)
}
// Requires only one parameter for convenient method
required override convenience init(no1: Int) {
self.init(no1:no1, no2:0)
}
}
let ressss = MainnnClass(no1: 20)
let showwwww = SubbbClass(no1: 30, no2: 50)
print("ressss is: \(ressss.no1)")
print("showwwww is: \(showwwww.no1)")
print("showwwww is: \(showwwww.no2)")
// E:泛型访问权限
// 泛型类型或泛型函数的访问级别取泛型类型、函数本身、泛型类型参数三者中的最低访问级别。
public struct TTOS<T> {
var items = [T]()
// private mutating func push(item: T) {
// items.append(item)
// }
public mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
}
var tost = TTOS<String>()
tost.push(item: "Swift")
print(tost.items)
tost.push(item: "泛型")
print(tost.items)
tost.push(item: "类型参数")
print(tost.items)
tost.push(item: "类型参数名")
print(tost.items)
let deletetos = tost.pop()
// F: 类型别名
// 任何你定义的类型别名都会被当作不同的类型,以便于进行访问控制。一个类型别名的访问级别不可高于原类型的访问级别。
// 比如说,一个private级别的类型别名可以设定给一个public、internal、private的类型,但是一个public级别的类型别名只能设定给一个public级别的类型,不能设定给internal或private 级别的类型。
// 注意:这条规则也适用于为满足协议一致性而给相关类型命名别名的情况。
public protocol Containercc {
associatedtype ItemType
mutating func append(item: ItemType)
var count: Int { get }
subscript(i: Int) -> ItemType { get }
}
struct Stackkk<T>: Containercc {
// original Stack<T> implementation
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
// conformance to the Container protocol
mutating func append(item: T) {
self.push(item: item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> T {
return items[i]
}
}
func allItemsMatched<
C1: Containercc, C2: Containercc>
(someContainer: C1, anotherContainer: C2) -> Bool
where C1.ItemType == C2.ItemType, C1.ItemType: Equatable {
// check that both containers contain the same number of items
if someContainer.count != anotherContainer.count {
return false
}
// check each pair of items to see if they are equivalent
for i in 0..<someContainer.count {
if someContainer[i] != anotherContainer[i] {
return false
}
}
// all items match, so return true
return true
}
var tosddd = Stackkk<String>()
tosddd.push(item: "Swift")
print(tosddd.items)
tosddd.push(item: "泛型")
print(tosddd.items)
tosddd.push(item: "Where 语句")
print(tosddd.items)
var tosff = Stackkk<String>()
tosff.push(item: "Swift")
print(tosff.items)
tosff.push(item: "泛型")
print(tosff.items)
tosff.push(item: "Where 语句")
print(tosff.items)
allItemsMatched(someContainer:tosddd,anotherContainer:tosff)
swift_030(Swift 的访问控制)相关推荐
- 翻译:Swift 5创建和使用Framework, XCFramework 从入门到精通
说明 了解如何构建iOS框架,该框架可让您在应用程序之间共享代码,模块化代码或将其分发为第三方库. 下载代码 更新说明:本教程已由Emad Ghorbaninia更新到iOS 14,Xcode 12和 ...
- Flutter开发(1)—— Dart vs Swift
原文链接: https://medium.com/coding-with-flutter/dart-vs-swift-a-comparison-6491e945dc17 发表日期: 2018.12.2 ...
- Dart vs Swift
| 作者:Andrea Bizzotto | 原文链接:medium.com/coding-with- Dart 和 Swift 是我最喜欢的编程语言.我在商业和开源代码中广泛使用它们. 本文提供了 ...
- Swif- 访问控制
//可以给类型, 属性, 方法, 构造器, 下标添加访问控制.协议, 全局常量,变量, 函数也可以限制范围, 下文统称 entity//1. Modules and Source Files//Swi ...
- Swift 新特性 - 访问控制(Access Control)
苹果在发布了Xcode 6 Bate 4后为Swift添加了新的特性--访问控制(Access Control),并且更新了The Swift Programming Language文档,我抽空把这 ...
- Swift之深入解析访问控制权限
一.简介 ① 概念 访问控制可以限定其他源文件或模块中代码代码的访问级别.可以明确地给单个类型(类.结构体.枚举)设置访问级别,也可以给这些类型的属性.函数.初始化方法.基本类型.下标索引等设置访问级 ...
- Swift学习笔记-访问控制(Access Control)
1.0 翻译:JaceFu 校对:ChildhoodAndy 2.0 翻译+校对:mmoaay 2.1 翻译:Prayer 校对:shanks,2015-11-01 本页内容包括: 模块和源文件 访问 ...
- iOS 访问控制权限【Swift】
对于每个语言都有属于自己的访问控制权限 对于Java来说:OC中提供了4个访问控制符: @private @package @protected @public . 对于iOS开发工程师使用OC语言的 ...
- Swift学习: 从Objective-C到Swift
作者:@方秋枋(GitHub) 这篇文章是自己学习Swift的笔记与深化.希望这篇文章能够帮助已经有Objective-C经验的开发者更快地学习Swift.同时也品味到Swift的精妙之处. 结论放在 ...
最新文章
- TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书
- velocity.js 动画插件
- win32文件读写demo
- 云计算机房所用服务器,什么是云机房、云服务器、云主机?这三者有什么区别?...
- const char *p、char const *p、char *const p
- 电路板上的插头怎么拔下来_空调插头一直不拔费电吗?实测一周竟然发现了真相!...
- 如何VMare虚拟机里安装Mac操作系统(图文详解)
- Android与server通信的方法之中的一个(json)效率不高安全性不好
- 【AIgua小白之路】Windows10安装MySQL10.0.15Archive版 【手把手系列】
- Python虚拟机之if控制流(一)
- JavaScript 优先队列
- 基于matlab的红外图像处理算法研究,基于小波的红外图像去噪算法研究
- HashMap如何解决hash冲突?
- 行为金融(八):羊群行为
- redis-trib.rb操作命令
- HTML5期末大作业:动漫A网站设计——动画漫展学习资料电影模板(6页) 网页设计作业 _ 动漫网页设计作业,网页设计作业 _ 动漫网页设计成品,网页设计作业 _ 动漫网页设计成品模板下载
- 修改Ceph 监视器地址
- 想要成为数据分析师,这些Excel必备知识点你得掌握
- 运行删除指定文件库rimraf
- mac android 录屏软件,mac录屏怎么录内置声音?详细的解决方案