GVKun编程网logo

在Swift中对齐与大步前进

23

在本文中,我们将给您介绍关于在Swift中对齐与大步前进的详细内容,此外,我们还将为您提供关于4.7Swift中swift中的switch语句、ios–仅在Swift中对象的生命周期内调用一次方法、i

在本文中,我们将给您介绍关于在Swift中对齐与大步前进的详细内容,此外,我们还将为您提供关于4.7 Swift中swift中的switch 语句、ios – 仅在Swift中对象的生命周期内调用一次方法、ios – 在Swift中对MKCircle进行子类化、ios – 在Swift中对SpriteKit类进行子类化的知识。

本文目录一览:

在Swift中对齐与大步前进

在Swift中对齐与大步前进

在斯威夫特4,MemoryLayout结构告诉你sizestridealignment一个类型。

我了解大小和步幅,但实际上不了解。

是否有 示例 显示对齐方式,与跨度有何不同,与跨度的值不同以及在何处使用跨度不正确但在对齐方式中正确?

我是否可以总是相互计算?

答案1

小编典典

这是一个简单的示例:

struct Foo {    let a: Int16    let b: Int8}print(MemoryLayout<Foo>.size)       // 3print(MemoryLayout<Foo>.alignment)  // 2print(MemoryLayout<Foo>.stride)     // 4
  • 对齐 的结构是其所有领域的最大的队列,在这种情况下,最大的21
  • 结构的 跨度 是将大小四舍五入为对齐的大小,此处3四舍五入为的倍数4

跨度是内存中相同类型的连续实例之间(起点)之间的距离:

let array = [Foo(a: 1, b:2), Foo(a: 3, b: 4), Foo(a: 5, b: 6)]array.withUnsafeBytes {    print(Data($0) as NSData) // <01000234 03000474 0500066f>    print($0.count) // 12}

结构跨度是结构对齐的倍数,因此所有实例(因此所有实例字段)都已正确对齐。

详细信息可以在Type
Layout中找到

脆弱的结构和元组布局

结构和元组当前共享相同的布局算法,在编译器实现中称为“通用”布局算法。算法如下:

  • 以0的大小和1的对齐方式开始。
  • 以元组的元素顺序或结构的var声明顺序遍历字段。对于每个字段:
    • 通过四舍五入到字段的对齐方式来更新大小,即将其增大到大于或等于大小的最小值,并且可以被字段的对齐方式整除。
    • 将字段的偏移量分配给size的当前值。
    • 通过添加字段的大小来更新大小。
    • 将对齐方式更新为最大对齐方式和字段的对齐方式。
  • 最终大小和对齐方式是聚合的大小和对齐方式。该类型的跨度是将最终大小四舍五入以对齐。

4.7 Swift中swift中的switch 语句

4.7 Swift中swift中的switch 语句

/**

switch 语句

*/

let str = "aAbBacdef"

let str2 = "aAbBadef"

let str3 = "aAbBadeff"


// var array = [];

for c in ["A","a",str3]

{

switch c {

// case "a":

case "a","A":

print("ldd")


// 必须有

default:

print("dd")

}

}

/**

case "a":

case "A":

print("ldd")

C语言中, 这样写 无论遇到 a A 都会执行 print("ldd")

swift中就不允许这样子了,但是可以这样子写

case "a","A": 中间用逗号隔开

*/

// switch value {

// case pattern:

// code

// default:

// }

/**

c 语言中

case 下面有个 break

如果忘了写break 会顺序执行下面的语句,直到执行break

但是swift语言就是看到这一点就,不要break了。比较case里面的条件后,

执行完毕后面的语句就自动退出 switch语句了。

如果想要继续执行 fallthrough

*/

ios – 仅在Swift中对象的生命周期内调用一次方法

ios – 仅在Swift中对象的生命周期内调用一次方法

假设我们覆盖scrollViewDidScroll方法,并且对于第一次只有滚动,我们想要doSomething()

一个简单的方法是实现这是一个实例级布尔变量并切换/检查它.

func scrollViewDidScroll(scrollView: UIScrollView!) {
  if(!scrolled) {
   scrolled = true; 
   doSomething(); 
  }
}

我想要一个更好的解决方案,不会引入滚动的布尔变量.类似于dispatch_once的东西,但是对象的生命周期而不是整个过程.

这个模式有名字吗?

解决方法

Something similar to dispatch_once but for the lifetime of the object rather than the whole process

不幸的是,dispatch_once在实例级别上并不安全.在Objective-C中使用它的人这样做是错误的.这就是为什么dispatch_once在Swift中不可用的原因.

你的if!滚动模式实际上是正确的实现(除了你使用括号,分号和其他非Swifty的东西).它被称为旗帜.

ios – 在Swift中对MKCircle进行子类化

ios – 在Swift中对MKCircle进行子类化

我想通过添加另一个String属性来继承MKCircle(例如MyCircle),我们称之为“代码”.这个属性不是可选的和常量的,所以我必须从初始化器设置它,对吧?当然MyCircle也应该得到中心坐标和半径.这两个属性是只读的,所以我还需要通过初始化程序设置它们.

最后我需要一个初始化器,它有3个参数:坐标,半径和代码.听起来很简单,但Swifts指定和便利的initalizers及其规则让我很难在这里.

问题是MKCircle的定义:

class MKCircle : MKShape,MKOverlay,MKAnnotation,NSObjectProtocol {

    convenience init(centerCoordinate coord: CLLocationCoordinate2D,radius: CLLocationdistance)

    convenience init(mapRect: MKMapRect) // radius will be determined from MAX(width,height)

    var coordinate: CLLocationCoordinate2D { get }
    var radius: CLLocationdistance { get }

    var boundingMapRect: MKMapRect { get }
}

正如您所看到的,MKCircle的初始化器采用坐标和半径是一个方便的初始化器,因此无法从我的子类的初始化器调用.此属性也是只读的,因此我无法从子类的初始值设置器或外部设置它们.

我尝试了很多变化,但似乎唯一可行的方法是使我的代码属性成为可选,使用继承的便利初始化程序来设置坐标和半径,然后设置代码属性,如下所示:

class MyCircle: MKCircle {
    var code: String?
}

overlay = MyCircle(centerCoordinate: coord,radius: radius)
overlay.code = code

我错过了什么?有没有办法定义一个单一的便利初始化器,在这种情况下需要3个参数?

提前谢谢了!

总结

以上是小编为你收集整理的ios – 在Swift中对MKCircle进行子类化全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

ios – 在Swift中对SpriteKit类进行子类化

ios – 在Swift中对SpriteKit类进行子类化

我对iOS开发很陌生,但我一直在玩SpriteKit模板应用程序,以了解工作原理并尝试在 Swift上启动.我遇到的一件事就是如何使用SpriteKit子类.

我在GameScene.swift文件中,我正在尝试为“Hello World”标签提取一个类,所以这是该文件的样子:

//  GameScene.swift

import SpriteKit

class HelloLabel: SKLabelNode {
    init(fontNamed: String) {
        super.init(fontNamed: fontNamed)
        self.text = "Hello,World!"
        self.fontSize = 65;
        self.position = CGPoint(x: 400,y: 500);
    }
}

class GameScene: SKScene {
    override func didMovetoView(view: SKView) {
        /* Setup your scene here */
//        let myLabel = SKLabelNode(fontNamed:"Chalkduster")
//        myLabel.text = "Hello,World!";
//        myLabel.fontSize = 65;
//        myLabel.position = CGPoint(x: 400,y: 500);

        let myLabel = HelloLabel(fontNamed: "Chalkduster")
        self.addChild(myLabel)
    }

    override func touchesBegan(touches: NSSet,withEvent event: UIEvent) {
        /* snip,no changes made here */
    }

    override func update(currentTime: CFTimeInterval) {
        /* snip,no changes made here */
    }
}

因此,HelloLabel旨在成为一个传递,试图了解所有内容是如何连接在一起的,但是当我运行应用程序时,我收到以下错误:

/Users/jon/Projects/ErrorExample/ErrorExample/GameScene.swift: 11: 11: Fatal error: use of unimplemented initializer 'init()' for class 'ErrorExample.HelloLabel'

我不明白这条消息试图告诉我的是什么.我读这个错误的方式是它抱怨我没有在ErrorExample.HelloLabel类中实现一个名为init的初始化程序,但它确实看起来像我必须得到的!

那么,我在这里做错了什么 – 如何提取一个类来隐藏所有这些设置?

解决方法

我不确定为什么,但SKLabelNode中隐藏的功能试图调用没有参数的init函数.这似乎有效:
class HelloLabel: SKLabelNode {
    init() {
        super.init()
    }

    init(fontNamed fontName: String!) {
        super.init(fontNamed: fontName)
        self.text = "Hello,y: 500);
    }
}

关于在Swift中对齐与大步前进的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于4.7 Swift中swift中的switch 语句、ios – 仅在Swift中对象的生命周期内调用一次方法、ios – 在Swift中对MKCircle进行子类化、ios – 在Swift中对SpriteKit类进行子类化的相关知识,请在本站寻找。

本文标签: