Swift学习(一)

news/2024/7/20 15:54:01 标签: swift, 内存管理, 移动开发

1、属性(property)和实例变量(instance variable)

在OC开发中,

@property (strong,nonatomic) NSString *string;

swift开发中,

class Shape {

  var name = "shape"

}

// strong :在Swift中是默认的。

// weak :关键字weak声明 weak var name:String

// readonley, readwrite 直接通过声明常量let,声明变量var的方式来指明。

// copy :用@NSCopying指令声明。

值得注意的是String,Array和Dictionary在Swift是以值类型(value type)而不是引用类型(reference type)出现,因此它们在赋值,初始化,参数传递中都是以拷贝的方式进行(简单来说,String,Array,Dictionary在Swift中是通过struct实现的)

// Value type example

struct S { var data: Int = -1 } var a = S() var b = a // a is copied to b a.data = 42 // Changes a, not b println("\(a.data), \(b.data)") // prints "42, -1"

// Reference type example

class C { var data: Int = -1 } var x = C() var y = x // x is copied to y x.data = 42 // changes the instance referred to by x (and y) println("\(x.data), \(y.data)") // prints "42, 42"

相关阅读:https://developer.apple.com/swift/blog/?id=10

// nonatomic, atomic 所有的Swift properties 都是nonatomic。在线程安全上已经有许多机制,例如NSLock,GCD相关API等。

-------------------------------------------------------------------------------------------------------------------------------

然后值得注意的是,在Objective-C中,我们可以跨过property直接与instance variable打交道,而在Swift是不可以的。

例如:我们可以不需要将someString声明为property,直接使用即可。即使我们将otherString声明为property,我们也可以直接用_otherString来使用property背后的实例变量。

@interface someClass : NSObject {

  NSString *someStr;

}

@prperty (nonatomic, copy) NSString *otherString;

@end

而在Swift中,我们不能直接与instance variable打交道。也就是我们声明的方式简化为简单的一种,简单来说在Swift中,我们只与property打交道。

在OC中initdealloc不能使用属性self.property = XXX来进行设置的情况得以解决和统一。

关于在init不能直接用self.property = value 阅读iOS内存管理:https://github.com/100mango/zen/blob/master/iOS%E5%A4%AF%E5%AE%9E%EF%BC%9A%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/iOS%E5%A4%AF%E5%AE%9E%EF%BC%9A%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.md 

-------------------------------------------------------------------------------------------------------------------------------

Swift 的property 分为 Stored Properties 和 Computed properties

stored properties :能够保存值;

computed properties :只提供getter/setter方法,利用stored properties 来生成自己的值。

Switf 单例模式

通过static定义的类变量无法在子类重写,通过class定义的类变量则可在子类重写。

swift">
struct SomeStructure {
    static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { return 1 } class var overrideableComputedTypeProperty: Int { return 107 } }

同时利用类变量我们也有了更优雅的单例模式实现:

swift">
class singletonClass {
    static let sharedInstance = singletonClass()
    private init() {} // 这就阻止其他对象使用这个类的默认的'()'初始化方法 } 

 Swift单例阅读扩展:http://krakendev.io/blog/the-right-way-to-write-a-singleton?utm_campaign=This%2BWeek%2Bin%2BSwift&utm_medium=web&utm_source=This_Week_in_Swift_45

 

目前Swift支持的type propertis中的Stored Properties类型不是传统意义上的类变量(class variable),暂时不能通过class 关键词定义,通过static定义的类变量类似java中的类变量,是无法被继承的,父类与子类的类变量指向的都是同一个静态变量。

相关资料: http://stackoverflow.com/questions/24015207/class-variables-not-yet-supported

class SomeStructure {
    class var storedTypeProperty = "Some value."
}

//Swift 2.0 
Error: Class stored properties not yet supported in classes


转载于:https://www.cnblogs.com/kimee/p/5032803.html


http://www.niftyadmin.cn/n/1025292.html

相关文章

java 向下转型报错_java的向下转型问题?

展开全部首先还是给出解决办e5a48de588b662616964757a686964616f31333433643038法吧:package d;import c.F;public class A extends F{public static void main(String[] args){A temp new A();F f (F) temp;if (f instanceof A){A a (A) f;System.out.println(a…

P53 T3

为方便旅客,某航空公司拟开发一个机票预定系统。旅行社把预定机票的旅客信息(姓名、性别、工作单位、身份证号码、旅行时间、旅行目的地等)输入进入该系统,系统为旅客安排航班,印出取票通知和账单,旅客在飞…

SQL Server安装后运行SSMS花屏现象的解决方法

SQL Server安装后运行SSMS出现花屏问题的解决方法 花屏图片如下: 解决方法 1、打开SSMS,在上方菜单栏里找到工具,单击找到选项 2、打开选项,选择环境,点击常规 3、先取消勾选“基于客户端性能自动调整视觉体验(…

java集合查询_Java:集合,ArrayList,请选择你要执行的功能1.查询2.添加3.修改4.删除,增删改查...

实现有功能“1.查询2.添加3.修改4.删除”的和ArrayList有关的程序package a;import java.util.ArrayList;import java.util.Scanner;public class lizi {public static void main(String[] args) {ArrayList arr new ArrayList();arr.add(new student(1, "诗名", 男…

Python入门函数的含义

列表 list.append(obj) 在列表末尾添加新的对象,只接受一个参数,参数可以是任何数据类型,被追加的元素在 list 中保持着原结构类型。 list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表&#x…

面向对象修饰符

private 私有的的成员既不能被外部访问,也不能被子类调用protected 受保护的成员不能被外部访问,但能被子类调用public 共有的成员既能被外部访问,也能被子类调用转载于:https://www.cnblogs.com/137dawn/p/5034612.html

python下

文章目录1函数参数1. 位置参数2. 默认参数3. 可变参数4. 关键字参数5. 命名关键字参数2 函数的返回值变量作用域3 Lambda 表达式1 匿名函数的定义2匿名函数的应用4类与对象1对象 属性 方法2、self 是什么?3 Python 的魔法方法公有和私有继承类、类对象和实例对象1…

全国二级C++试题记录

const是一个C语言的关键字,它限定一个变量不允许被改变。 使用const在一定程度上可以提高程序的安全性和可靠性。限定符声明变量只能被读,必须初始化。 定义时初始化与否均可,如果是const*double point形式,则为常指针&#xff…