你一定不知道Swift源码怎么看?
我想你一定是在开玩笑。
知乎果然没有让我失望,结果教程如下;
顺便提一下,这次搜索还让我发现了一个比较不错的swift网站,有心的同学请收下:swift.gg 于是今天搞了下源码的编译,并了解到一个叫做 GYB 的东西,这个东西今天先放一下。源碼編譯的過程無非就是用 brew 下了一些命令行軟件,然後使用 build 腳本跑一下過程,在此也不多說。但是今天的重點當然是我們要從源碼出發搞一些事情。 一个Hash类型,提供了一个 hashValue 的属性,它是一个整型常量, 如果有两个相同类型的a,b,如果 a == b,那么 a.hashValue == b.hashValue;但是反过来,如果两个hash值相同,并不表示a 就一定等于 b; /// A point in an x-y coordinate system.
struct GridPoint {
var x: Int
var y: Int
}
extension GridPoint: Hashable {
var hashValue: Int {
return x.hashValue ^ y.hashValue &* 16777619
}
static func == (lhs: GridPoint,rhs: GridPoint) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
}
var tappedPoints: Set = [GridPoint(x: 2,y: 3),GridPoint(x: 4,y: 1)]
let nextTap = GridPoint(x: 0,y: 1)
if tappedPoints.contains(nextTap) {
print("Already tapped at ((nextTap.x),(nextTap.y)).")
} else {
tappedPoints.insert(nextTap)
print("New tap detected at ((nextTap.x),(nextTap.y)).")
}
// Prints "New tap detected at (0,1).")
在实现的代码里有一些奇怪的符号,暂时还有点摸不清头脑,有些是一些编译符号,大体能看懂点意思,但有些像
需要具体了解的看这篇:UnsafePointe 顺便吐槽句哈,apple的代码也还有这种东西,也不知道是修改过的没有; let students = ["Nora","Fern","Ryan","Rainer"]
let nameToCheck = "Ryan"
if students.contains(nameToCheck) {
print("(nameToCheck) is signed up!")
} else {
print("No record of (nameToCheck).")
}
// Prints "Ryan is signed up!"
/// Conforming to the Equatable Protocol
=
class StreetAddress {
let number: String
let street: String
let unit: String?
init(_ number: String,_ street: String,unit: String? = nil) {
self.number = number
self.street = street
self.unit = unit
}
}
extension StreetAddress: Equatable {
static func == (lhs: StreetAddress,rhs: StreetAddress) -> Bool {
return
lhs.number == rhs.number &&
lhs.street == rhs.street &&
lhs.unit == rhs.unit
}
}
let addresses = [StreetAddress("1490","Grove Street"),StreetAddress("2119","Maple Avenue"),StreetAddress("1400","16th Street")]
let home = StreetAddress("1400","16th Street")
print(addresses[0] == home)
// Prints "false"
print(addresses.contains(home))
// Prints "true"
class IntegerRef: Equatable {
let value: Int
init(_ value: Int) {
self.value = value
}
static func == (lhs: IntegerRef,rhs: IntegerRef) -> Bool {
return lhs.value == rhs.value
}
}
let a = IntegerRef(100)
let b = IntegerRef(100)
print(a == a,a == b,separator: ",")
// Prints "true,true"
而不相等的定义则完全是,自实现的相等操作取反: extension Equatable {
/// Returns a Boolean value indicating whether two values are not equal.
///
/// Inequality is the inverse of equality. For any values `a` and `b`,`a != b`
/// implies that `a == b` is `false`.
///
/// This is the default implementation of the not-equal-to operator (`!=`)
/// for any type that conforms to `Equatable`.
///
/// - Parameters:
/// - lhs: A value to compare.
/// - rhs: Another value to compare.
@inlinable // FIXME(sil-serialize-all)
@_transparent
public static func != (lhs: Self,rhs: Self) -> Bool {
return !(lhs == rhs)
}
}
这个实现是已经定义好的!!! public protocol Equatable {
/// Returns a Boolean value indicating whether two values are equal.
///
/// Equality is the inverse of inequality. For any values `a` and `b`,
/// `a == b` implies that `a != b` is `false`.
///
/// - Parameters:
/// - lhs: A value to compare.
/// - rhs: Another value to compare.
static func == (lhs: Self,rhs: Self) -> Bool
}
@inlinable // FIXME(sil-serialize-all)
public func === (lhs: AnyObject?,rhs: AnyObject?) -> Bool {
switch (lhs,rhs) {
case let (l?,r?):
return ObjectIdentifier(l) == ObjectIdentifier(r)
case (nil,nil):
return true
default:
return false
}
}
从以上可以看出, (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- objective-c – Xcode:Cocos2d:无法用Box2D创建世界
- ruby-on-rails-3 – 这是使用Haml显示/连接文本的正确方法吗
- Ajax(1):get请求
- ruby-on-rails – Rails 3级深层嵌套资源
- Liquibase从Oracle数据库导出数据 – generateChangeLog
- jsonStore获取属性中的值
- 通过NOT使用正则表达式算法和python中的代码进行模式搜索
- .net – Linq-to-XML获取带命名空间的元素
- iis – 如何通过使用基本身份验证在WCF 4.0 RESTful服务中传
- swift – 如何在显示屏幕保护程序时唤醒应用程序