swift 将类型指定为值类型

vm0i2vca  于 2023-09-30  发布在  Swift
关注(0)|答案(1)|浏览(87)

在Swift 5.9中,有一个新的警告:
将“UnsafeRawPointer”构造为类型为“[T]”的变量;这可能不正确,因为“Element”可能包含对象引用。
因为T上没有类型强制,所以当我们传入引用类型值时,它会警告我们不安全的使用。
下面是我的代码:

func aFunc<T>(values: [T]) -> MTLBuffer {
  let buffer = makeMTLBuffer()
  let bufferPointer = buffer.contents()
  memcpy(bufferPointer, values, size)
  return buffer
}

有没有什么方法可以将T指定为值类型,这样它就不会发出警告?我们有: AnyObject来指定引用类型,但我找不到指定值类型的方法。

mqkwyuun

mqkwyuun1#

protocol ValueType {}

extension Int: ValueType {}
extension Double: ValueType {}
// Add more types as needed

func aFunc<T: ValueType>(values: [T]) -> MTLBuffer {
    // Your implementation here
}

// Example usage
let intBuffer = aFunc(values: [1, 2, 3])
let doubleBuffer = aFunc(values: [1.0, 2.0, 3.0])

注意:可以使类符合ValueType协议。在Swift中,协议并不排斥值类型或引用类型。
不幸的是,Swift的类型系统没有内置的支持来区分泛型约束中的值类型和引用类型,所以没有直接的方法来强制泛型类型参数必须是值类型。

protocol MyProtocolDelegate: AnyObject {
    // Protocol stuff goes here
}

class SomeClass {
    weak var delegate: MyProtocolDelegate?
}

使用AnyObject,你可以说只有类可以遵循这个协议,而结构体或枚举不能。

相关问题