GVKun编程网logo

如何在Swift中将错误传递给堆栈跟踪(swift 错误处理)

8

在这里,我们将给大家分享关于如何在Swift中将错误传递给堆栈跟踪的知识,让您更了解swift错误处理的本质,同时也会涉及到如何更有效地ios–在Swift1.2中将自身作为参数传递给init方法、i

在这里,我们将给大家分享关于如何在Swift中将错误传递给堆栈跟踪的知识,让您更了解swift 错误处理的本质,同时也会涉及到如何更有效地ios – 在Swift 1.2中将自身作为参数传递给init方法、ios – 在Swift中将参数传递给选择器、ios – 如何在Swift中将图像导出为视频?、ios – 如何在Swift中将小数截断为x位的内容。

本文目录一览:

如何在Swift中将错误传递给堆栈跟踪(swift 错误处理)

如何在Swift中将错误传递给堆栈跟踪(swift 错误处理)

在Java中,如果一个方法抛出错误,则调用它的方法可以将其传递给下一个方法。

public void foo() throws Exception {     throw new Exception();}public void bar() throws Exception {     foo();}public static void main(String args[]) {     try {         bar();     }     catch(Exception e) {         System.out.println("Error");     }}

我正在迅速编写一个应用程序,并且希望做同样的事情。这可能吗?如果不可能,还有哪些其他可能的解决方案?我进行调用的原始函数具有此结构。

func convert(name: String) throws -> String {}

答案1

小编典典

参考Swift-
错误处理文档,您应该:

1- 通过声明符合错误协议的 枚举
来创建自定义错误类型:

enum CustomError: Error {    case error01}

2- 声明foo()为可抛出函数:

func foo() throws {    throw CustomError.error01}

3- 声明bar()为throwable函数:

func bar() throws {    try foo()}

需要注意的是,虽然bar()是抛出(throws),它并 没有
包含throw,为什么呢?因为它调用foo()(这也是一个引发错误的函数)的调用try方式是-将隐式地- 抛出该异常foo()

为了更清楚一点:

4- 实施test()功能(抓捕):

func test() {    do {        try bar()    } catch {        print("\(error) has been caught!")    }}

5- 通话test()功能:

test() // error01 has been caught!

如您所见,bar()自动引发错误,这是指foo()函数错误引发。

ios – 在Swift 1.2中将自身作为参数传递给init方法

ios – 在Swift 1.2中将自身作为参数传递给init方法

以下类将’let’属性声明为隐式展开的变量.这之前适用于 Xcode 6.2:
class SubView: UIView {

    let pandGestureRecognizer: UIPanGestureRecognizer!

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.pandGestureRecognizer = UIPanGestureRecognizer(target: self,action: "panAction:")
    }

    func panAction(gesture: UIPanGestureRecognizer) {
        // ...
    }
}

更新到Xcode 6.3(使用Swift 1.2)后,会发生以下编译错误:

Property 'self.panGestureRecognizer' not initialized at super.init call
Immutable value 'self.panGestureRecognizer' may only be initialized once

在super.init调用之前移动以下行:

self.pandGestureRecognizer = UIPanGestureRecognizer(target: self,action: "panAction:")

给出以下错误:

'self' is used before super.init call

属性’panGestureRecognizer’不需要变异,因此必须将其声明为常量’let’.由于它是常量,因此必须在声明时具有初始值,或者在init方法中初始化它.要初始化它,需要在’target’参数中传递’self’.

其他线程建议将其声明为隐式解包可选,并在super.init调用后初始化它.这之前一直有效,直到我更新到Xcode 6.3.

有没有人知道这种情况的正确实施或解决方法?

解决方法

问题

问题是你使用let-optionals声明为let没有给出默认值nil(然而var是).以下是在Swift 1.2中引入的,否则将无效,因为在声明之后你将无法给myOptional一个值:

let myOptional: Int?

if myCondition {
    myOptional = 1
} else {
    myOptional = nil
}

因此,你得到错误’属性’self.panGestureRecognizer’未在super.init调用’初始化’因为在调用super.init(coder:aDecoder)之前,因为panGestureRecognizer不是nil;它根本没有初始化.

解决方案:

1.将panGestureRecognizer声明为var,意味着它将被赋予默认值nil,然后在调用super.init(coder:aDecoder)之后可以更改.

2.在我看来,更好的解决方案是:不要使用隐式展开的可选项,并使用初始值UIPanGestureRecognizer()声明panGestureRecognizer.然后在调用super.init后设置目标:

class SubView: UIView {
    let panGestureRecognizer = UIPanGestureRecognizer()

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        panGestureRecognizer.addTarget(self,action: Selector("panAction:"))
    }
}

ios – 在Swift中将参数传递给选择器

ios – 在Swift中将参数传递给选择器

我是以编程方式将UITapGestureRecognizer添加到我的一个视图中:

let gesture = UITapGestureRecognizer(target: self,action: #selector(self.handleTap(modelObj:myModelObj)))

self.imageView.addGestureRecognizer(gesture)

func handleTap(modelObj: Model) {
  // Doing stuff with model object here
}

我遇到的第一个问题是“#selector’的参数’没有引用’@Objc’方法,属性或初始值设定项.

很酷,所以我将@objc添加到handleTap签名:

@objc func handleTap(modelObj: Model) {
  // Doing stuff with model object here
}

现在我收到错误“方法无法标记为@objc,因为参数的类型无法在Objective-C中表示.

它只是建筑物地图的图像,其中一些图像指示了兴趣点的位置.当用户点击这些引脚中的一个时,我想知道他们挖掘了哪个兴趣点,并且我有一个描述这些兴趣点的模型对象.我使用这个模型对象给它在地图上的坐标图像,所以我认为将对象发送到手势处理程序是很容易的.

解决方法

看起来你误解了一些事情.

使用target/action时,功能签名必须具有某种形式……

func doSomething(sender: Any)

要么

func doSomething(sender: Any,forEvent event: UIEvent)

哪里…

The sender parameter is the control object sending the action message.

在您的情况下,发件人是UITapGestureRecognizer

此外,#selector()应包含func签名,并且不包含传递的参数.因此对于…

func handleTap(sender: UIGestureRecognizer) {

}

你应该有…

let gesture = UITapGestureRecognizer(target: self,action: #selector(handleTap(sender:)))

假设func和手势在一个视图控制器中,其中modelObj是属性/ ivar,没有必要用手势识别器传递它,你可以在handleTap中引用它

ios – 如何在Swift中将图像导出为视频?

ios – 如何在Swift中将图像导出为视频?

我正在 Swift中制作一个应用程序(我有最后的xcode更新),必须从一些图像生成视频.
我从这个答案 How do I export UIImage array as a movie?得到了代码
我把这个函数称为:

let size = CGSize(width: 1280,height: 720)
let pathVideo = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask,true)
let percorsoVideo = pathVideo[0]
writeImagesAsMovie(arrayImmagini,videoPath: percorsoVideo+"/prova.mp4",videoSize: size,videoFPS: 1)

“arrayImmagini”的字面定义如下:

var arrayImmagini = [UIImage(imageLiteral: "Frames/turtle/turtle0.jpg"),UIImage(imageLiteral: "Frames/turtle/turtle1.jpg"),...]

当我尝试运行代码时,我得到一个完全黑色的视频,而xcode给了我这两个错误的次数与数组中的数量一样多:

Sep  5 09:24:15  Prova[1554] <Error>: CGBitmapContextCreate: invalid data bytes/row: should be at least 7680 for 8 integer bits/component,3 components,kCGImageAlphaPremultipliedFirst.
Sep  5 09:24:15  Prova[1554] <Error>: CGContextDrawImage: invalid context 0x0. If you want to see the backtrace,please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.

阅读有关CGBitmapContextCreate的文档,我尝试以不同方式调用它:

func fillPixelBufferFromImage(image: UIImage,pixelBuffer: CVPixelBufferRef) {
    CVPixelBufferLockBaseAddress(pixelBuffer,0)

    let pixelData = CVPixelBufferGetBaseAddress(pixelBuffer)
    let rgbColorSpace = CGColorSpaceCreateDeviceRGB()

    // Create CGBitmapContext
    let context = CGBitmapContextCreate(
        nil,Int(image.size.width),Int(image.size.height),8,rgbColorSpace,CGImageAlphaInfo.PremultipliedFirst.rawValue
    )

    // Draw image into context
    CGContextDrawImage(context,CGRectMake(0,image.size.width,image.size.height),image.CGImage)

    CVPixelBufferUnlockBaseAddress(pixelBuffer,0)
}

代替:

func fillPixelBufferFromImage(image: UIImage,0)

    let pixelData = CVPixelBufferGetBaseAddress(pixelBuffer)
    let rgbColorSpace = CGColorSpaceCreateDeviceRGB()

    // Create CGBitmapContext
    let context = CGBitmapContextCreate(
        pixelData,CVPixelBufferGetBytesPerRow(pixelBuffer),0)
}

这使xcode停止给我错误,但我仍然得到一个黑色视频.
请帮助我,我是应用程序开发的新手,甚至更新的AVFoundation,我没有任何关于如何自己解决它的线索.
谢谢!

解决方法

经过多次尝试完成这项工作后,我发现了问题所在.
您不能将视频大小设置为比图片大小更小.
一旦我这样做,一切正常:

let size = CGSize(width: 1920,height: 1280)

ios – 如何在Swift中将小数截断为x位

ios – 如何在Swift中将小数截断为x位

在我的 swift程序中,我有一个非常长的十进制数(比如17.9384693864596069567),我想将小数截断为几个小数位(所以我希望输出为17.9384).我不想将数字四舍五入到17.9385.我怎样才能做到这一点?

感谢帮助!

注意:这不是重复的,因为在使用其中一些函数之前,它们使用的是旧版本的swift.此外,他们使用浮点数和整数,而我说的是双打.他们的问题/答案要复杂得多.

解决方法

你可以通过将它作为Double的扩展来进一步整理它
extension Double
{
    func truncate(places : Int)-> Double
    {
        return Double(floor(pow(10.0,Double(places)) * self)/pow(10.0,Double(places)))
    }
}

你就这样用它

var num = 1.23456789
// return the number truncated to 2 places
print(num.truncate(2))

// return the number truncated to 6 places
print(num.truncate(6))

今天关于如何在Swift中将错误传递给堆栈跟踪swift 错误处理的讲解已经结束,谢谢您的阅读,如果想了解更多关于ios – 在Swift 1.2中将自身作为参数传递给init方法、ios – 在Swift中将参数传递给选择器、ios – 如何在Swift中将图像导出为视频?、ios – 如何在Swift中将小数截断为x位的相关知识,请在本站搜索。

本文标签: