在这里,我们将给大家分享关于如何在Swift中将错误传递给堆栈跟踪的知识,让您更了解swift错误处理的本质,同时也会涉及到如何更有效地ios–在Swift1.2中将自身作为参数传递给init方法、i
在这里,我们将给大家分享关于如何在Swift中将错误传递给堆栈跟踪的知识,让您更了解swift 错误处理的本质,同时也会涉及到如何更有效地ios – 在Swift 1.2中将自身作为参数传递给init方法、ios – 在Swift中将参数传递给选择器、ios – 如何在Swift中将图像导出为视频?、ios – 如何在Swift中将小数截断为x位的内容。
本文目录一览:- 如何在Swift中将错误传递给堆栈跟踪(swift 错误处理)
- ios – 在Swift 1.2中将自身作为参数传递给init方法
- ios – 在Swift中将参数传递给选择器
- ios – 如何在Swift中将图像导出为视频?
- ios – 如何在Swift中将小数截断为x位
如何在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方法
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中将参数传递给选择器
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中将图像导出为视频?
我从这个答案 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位
感谢帮助!
注意:这不是重复的,因为在使用其中一些函数之前,它们使用的是旧版本的swift.此外,他们使用浮点数和整数,而我说的是双打.他们的问题/答案要复杂得多.
解决方法
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位的相关知识,请在本站搜索。
本文标签: