@usableFromInline 和 @inlinable 都是 Swift 中用于控制函数内联的属性,但它们有着不同的用途和含义。
•用途:@usableFromInline 用于标记一个函数或方法,表示虽然它可以在内联上下文中使用,但不应该被实际内联。换句话说,它表明该函数或方法可以被其他 @inlinable 函数调用,但自身不应该被内联。
这句话可能不太直观,结合下边的代码示例说一下:在调用multiply(3, 4)时,因他是内联函数,我们需要将multiply内联到调用的位置,但是该函数又调用了helperFunction函数,而helperFunction被标记为@usableFromInline,意思是供内联函数调用,但他不应该被内联到调用的位置。而如果helperFunction也被标记为了@inlinable,那调用helperFunction函数时就也要把其内联过来。
•适用场景:主要用于内部实现细节,特别是当您希望某些辅助函数只在特定的内联上下文中可用时。
// 导出到其他模块时可以内联
@inlinable
func add(_ x: Int, _ y: Int) -> Int {
return x + y
}
// 只在内联上下文中使用,不应被内联
@usableFromInline
func helperFunction(_ x: Int) -> Int {
return x * 2
}
// 导入其他模块时可以内联
@inlinable
func multiply(_ x: Int, _ y: Int) -> Int {
return helperFunction(x) * y
}
// 使用这些函数
let sum = add(3, 4)
let product = multiply(3, 4)
print("Sum: \(sum), Product: \(product)")