我在Swift中创建了一个^^运算符。与所有其他运算符一样,如何与Integers和Doubles一起使用?
infix operator ^^ { }
func ^^ (number:Int, power: Int) -> Int {
var result = power > 0 ? number : 0
if power > 1 { for x in 1..<power { result *= number } }
return result
}
这是一个使用操作符重载的类型安全的实现。对于整数类型,您可以定义^^
为
infix operator ^^ { associativity left precedence 170 }
func ^^<T : IntegerType, U : IntegerType> (base: T, var power: U) -> T {
if power < 0 { return 0 }
var result : T = 1
var square : T = base
if power > 0 {
if power % 2 == 1 { result *= square }
power /= 2
}
while power > 0 {
square *= square
if power % 2 == 1 { result *= square }
power /= 2
}
return result
}
(我选择了一种更有效的变体,称为“通过重复平方和乘法求幂”。)
对于浮点类型,定义一个协议,该协议涵盖可以从和转换为的所有类型Double
:
protocol DoubleConvertible {
init(_ value: Double)
var doubleValue : Double { get }
}
并作出Float
,Double
并CGFloat
符合该协议:
extension Double : DoubleConvertible {
var doubleValue : Double { return self }
}
extension Float : DoubleConvertible {
var doubleValue : Double { return Double(self) }
}
extension CGFloat : DoubleConvertible {
var doubleValue : Double { return Double(self) }
}
现在,浮点指数可以简单地定义为
func ^^<T : DoubleConvertible, U:DoubleConvertible> (base: T, power: U) -> T {
return T(pow(base.doubleValue, power.doubleValue))
}
例子:
let x1 = 2^^3 // Int
let x2 = UInt64(2)^^3 // UInt64
let x3 = 2.0 ^^ 3 // Double
let x4 = Float(2.0) ^^ 3 // Float
let x5 = "a" ^^ "b" // Compiler error
Swift 4更新:
IntegerType
已变为BinaryInteger
(SE-0104面向协议的整数),并且声明了运算符的语法已更改(SE-0077改进了运算符声明)。
这是所有具有Int
指数的整数和浮点基数的实现:
precedencegroup ExponentiationPrecedence { associativity: right higherThan: MultiplicationPrecedence }
infix operator ^^: ExponentiationPrecedence
func ^^<T : BinaryInteger>(base: T, power: Int) -> T {
if power < 0 { return 0 }
var power = power
var result: T = 1
var square = base
if power > 0 {
if power % 2 == 1 { result *= square }
power /= 2
}
while power > 0 {
square *= square
if power % 2 == 1 { result *= square }
power /= 2
}
return result
}
func ^^(base: Float, power: Int) -> Float {
return pow(base, Float(power))
}
func ^^(base: Double, power: Int) -> Double {
return pow(base, Double(power))
}
func ^^(base: CGFloat, power: Int) -> CGFloat {
return pow(base, CGFloat(power))
}
例子:
let x1 = 2^^3 // Int
let x2 = UInt64(2)^^3 // UInt64
let x3 = 2.0 ^^ -3 // Double
let x4 = Float(2.0) ^^ 3 // Float
// let x6 = "a" ^^ 5 // Compiler error
有关 Swift 4中引入的新协议层次结构,请参阅SE-0104面向协议的整数。
问题内容: 我没有在Swift语言参考的基本算术运算符中看到定义的幂运算符。 语言中真的没有预定义的整数或浮点运算符吗? 问题答案: 没有操作员,但是您可以使用pow函数,如下所示: 如果愿意,还可以让操作员像这样调用pow函数:
问题内容: 我正在寻找可以在SQL Server中正常工作的东西,类似于c#中的符号,它会使字符串按照原义被接受。例如: 注意@如何影响字符串按原样使用每个字符。 现在,我不确定这是否可行,但这是我的问题,也许有更好的方法来解决此问题。考虑以下基本查询: 我的问题是,如果他们放置,或其他任何会影响我的like子句的特殊字符。我希望比赛表现得像“开始于”功能。那么,有什么我可以应用到@searchT
问题内容: 我有一个包含字符串类型主键的实体。该实体模型如下: 但是我面临说TypeMismatch的问题。 问题答案: 如果您未指定ID生成策略,则Hibernate将使用。这将导致 AUTO-标识列,序列或表,具体取决于基础数据库。 如果你看看这里,你会发现所有的生成类型的IDS,或,不是类型。 假设您要使用UUID作为ID,则可以使用
本文向大家介绍详解Swift中的Characters字符类型与String字符串类型,包括了详解Swift中的Characters字符类型与String字符串类型的使用技巧和注意事项,需要的朋友参考一下 一、引言 Swift中提供了String类型与Characters类型来处理字符串和字符数据,Swift中的String类型除了提供了许多方便开发者使用的方法外,还可以与Foundation框架的
我试图在EventEmitter上使用一些简单的操作符(来自FormModel.valueChanges),但我不知道应该如何实现。 EventEmitter类从Subject扩展而来
我试图使用二元运算符来比较两个值: 现在,我收到一条失败消息:二进制运算符“==”不能应用于unichar或String类型的操作数。我还尝试转换字符: 不工作...