swift_实例方法

/**

 *  实例方法

 实例方法是属于某个特定类、结构体或者枚举类型实例的方法

 */

//class Counter{

//    var count = 0

//    func increment() {

//        count+=1

//    }

//    func incrementBy(amount: Int) {

//        count += amount;

//    }

//    func reset() {

//        count = 0

//    }

//}

//

调用

//let counter = Counter()

//counter.increment()

//counter.incrementBy(2)

//counter.reset()

//方法的局部参数名称和外部参数名称

/*

 Swift 默认仅给方法的第一个参数名称一个局部参数名称;默认同时给第二个和后续的参数名称局部 

 参数名称和外部参数名称。这个约定与典型的命名和调用约定相适应,与你在写 Objective-C 的方法时很相 似。

 这个约定还让表达式方法在调用时不需要再限定参数名称。

 */

//class Counter {

//    var count: Int = 0

//    func incrementBy(amount: Int, numberOfTimes: Int) {

//        count = amount * numberOfTimes

//    }

//    //修改方法的外部参数名称

//    func addcrementBy(anmount: Int,_ time:Int) {

//        count = anmount + time;

//    }

//    func hhCrementBy(anmount: Int, Time time:Int) {

//        count = anmount - time

//    }

//}

定义

//var counter = Counter()

展示

//counter.incrementBy(3, numberOfTimes: 5);

修改方法的外部参数名称

//counter.addcrementBy(4, 6)

//counter.hhCrementBy(7, Time: 3)

//self 属性

/*

 类型的每一个实例都有一个隐含属性叫做 self , self 完全等同于该实例本身。

 你可以在一个实例的实例方法中 使用这个隐含的 self 属性来引用当前实例。

 */

/*

 使用场景:

 使用这条规则的主要场景是实例方法的某个参数名称与实例的某个属性名称相同的时候。

 在这种情况下,参数名 称享有优先权,并且在引用属性时必须使用一种更严格的方式。这时你可以使用 

 self 属性来区分参数名称和属性 名称

 */

//struct Point {

//    var x = 0.0, y = 0.0

//    func isToTheRightOfX(x: Double) -> Bool {

//        return self.x > x

//    }

//}

//let somePoint = Point(x: 4.0, y: 5.0)

//if somePoint.isToTheRightOfX(1.0) {

//    print("This point is to the right of the line where x == 1.0")

//}

// 打印输出: This point is to the right of the line where x == 1.0

//如果不使用 self 前缀,Swift 就认为两次使用的 x 都指的是名称为 x 的函数参数。

//在实例方法中修改值类型

/*

 结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改。

 但是,如果你确实需要在某个具体的方法中修改结构体或者枚举的属性,你可以选择 变异(mutating) 这个方 ,

 然后方法就可以从方法内部改变它的属性;并且它做的任何改变在方法结束时还会保留在原始结构中。

 方法 还可以给它隐含的 self 属性赋值一个全新的实例,这个新实例在方法结束后将替换原来的实例。

 */

//struct Point {

//    var x = 0.0, y = 0.0

//    mutating func moveByX(deltaX: Double, deltaY:Double){

//        x += deltaX

//        y += deltaY

//    }

//}

//

//var somePoint = Point(x: 1.0, y: 1.0)

//somePoint.moveByX(2.0, deltaY: 3.0)

//print("now \(somePoint.x), \(somePoint.y)")


/*

 注意:

 不能在结构体类型常量上调用可变方法,因为常量的属性不能被改变,即使想改变的是常量的变量属性也 不行

 */


//let fixedPoint = Point(x: 3.0, y: 3.0)

//fixedPoint.moveByX(2.0, y: 3.0)

// 这里将会抛出一个错误


//可变方法能够赋给隐含属性 self 一个全新的实例。上面 Point 的例子可以用下面的方式改写

//struct Point {

//    var x = 0.0, y = 0.0

//    mutating func moveByX(deltaX: Double, y deltaY: Double) {

//        self = Point(x: x + deltaX, y: y + deltaY)

//    }

//}

//新版的可变方法 moveByX(_:y:) 创建了一个新的结构(它的 x y 的值都被设定为目标值)。调用这个版本的 方法和调用上个版本的最终结果是一样的。

//enum TriStateSwitch{

//    case Off, Low, High

//    mutating func next(){

//        switch self {

//        case Off:

//            self = Low;

//        case Low:

//            self = High

//       case High:

//            self = Off

//        }

//    }

//}

//

//var stateSwitch = TriStateSwitch.Low

//stateSwitch.next()

//stateSwitch.next()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SwiftUI是苹果公司推出的一款全新的UI框架,可以用于开发iOS、iPadOS、macOS、watchOS等操作系统上的应用程序。在SwiftUI中,开发者可以使用简单易懂的语法和组件来构建应用程序的UI界面,同时也可以方便地实现各种交互效果和动画效果。 对于视频播放器的开发,SwiftUI也提供了相关的组件和API,可以轻松实现视频的播放和控制。同时,SwiftUI也提供了对核心图像的实时处理支持,开发者可以使用Metal等技术对视频图像进行实时处理,实现各种特效和滤镜效果。 在SwiftUI中,实现视频播放器可以使用`AVPlayer`和`AVPlayerLayer`等组件,同时也可以使用`VideoPlayer`组件快速构建一个基本的视频播放器。对于实时处理核心图像,可以使用`MTKView`组件和`MetalPerformanceShaders`框架来实现。 下面是一个示例代码,演示如何使用SwiftUI实现一个简单的视频播放器,并对视频进行实时处理: ```swift import SwiftUI import AVKit import MetalKit import MetalPerformanceShaders struct VideoPlayerView: UIViewRepresentable { let player: AVPlayer let filter: MPSImageGaussianBlur func makeUIView(context: Context) -> some UIView { let playerLayer = AVPlayerLayer(player: player) playerLayer.videoGravity = .resizeAspectFill playerLayer.frame = UIScreen.main.bounds let metalView = MTKView(frame: UIScreen.main.bounds) metalView.device = MTLCreateSystemDefaultDevice() metalView.colorPixelFormat = .bgra8Unorm let commandQueue = metalView.device?.makeCommandQueue() let textureDescriptor = MTLTextureDescriptor.texture2DDescriptor( pixelFormat: .bgra8Unorm, width: Int(metalView.frame.width), height: Int(metalView.frame.height), mipmapped: false) let texture = metalView.device?.makeTexture(descriptor: textureDescriptor) filter.encode(commandBuffer: commandQueue!.makeCommandBuffer()!, sourceTexture: texture!, destinationTexture: texture!) metalView.texture = texture let stackView = UIStackView(frame: UIScreen.main.bounds) stackView.axis = .vertical stackView.distribution = .fillEqually stackView.addArrangedSubview(playerLayer) stackView.addArrangedSubview(metalView) return stackView } func updateUIView(_ uiView: UIViewType, context: Context) { } } struct ContentView: View { let player: AVPlayer var body: some View { VideoPlayerView(player: player, filter: MPSImageGaussianBlur(device: MTLCreateSystemDefaultDevice()!, sigma: 10.0)) } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView(player: AVPlayer(url: URL(string: "https://example.com/video.mp4")!)) } } ``` 在上面的示例代码中,`VideoPlayerView`是一个UIViewRepresentable,用于将AVPlayer和实时处理的MetalView结合起来。在`makeUIView`方法中,首先创建一个AVPlayerLayer和一个MTKView,并将它们添加到一个UIStackView中。然后,创建一个MPSImageGaussianBlur实例,并使用MetalPerformanceShaders框架对视频图像进行高斯模糊处理,最后将处理结果渲染到MTKView中。 在`ContentView`中,创建AVPlayer实例并将其传递给VideoPlayerView。通过这种方式,可以轻松实现一个支持实时处理核心图像的视频播放器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值